5 Best Ways to Check if Starting Digits Are Similar in a List in Python

πŸ’‘ Problem Formulation: You have a list of numbers or strings, and you need to check if the starting digits of these elements are identical. For example, given the list ['12345', '12367', '12399'], the desired output is True since the starting digits ‘123’ are similar for all elements.

Method 1: Using a Loop and.startswith()

This method employs a loop to iterate through each element in the list, comparing the beginning of each string with a predefined prefix. The .startswith() method is used to check if a string starts with the specified digits.

Here’s an example:

numbers = ['12345', '12367', '12399']
prefix = numbers[0][:3]  
is_same_start = all(num.startswith(prefix) for num in numbers)

print(is_same_start)

Output: True

This code snippet checks if all elements of the numbers list start with the same digits as the first element’s first three digits. It uses list comprehension alongside the built-in all() function to verify that each number adheres to this condition.

Method 2: Using Slicing and Set

In this method, we extract the starting digits using slicing and then convert the resulting list to a set to ensure uniqueness. If the resulting set has only one element, all starting digits are the same.

Here’s an example:

numbers = ['12345', '12367', '12399']
first_three_digits = {num[:3] for num in numbers} 
is_same_start = len(first_three_digits) == 1

print(is_same_start)

Output: True

We create a set of the first three digits from each element and then verify if the set’s length is one, indicating all starting digits are the same. Sets in Python disallow duplicates, thus serving as a quick uniqueness filter.

Method 3: Using itertools.groupby()

The itertools.groupby() function can be used to group list elements that have the same starting digits. If we can form only one group from the starting digits, they are all similar.

Here’s an example:

from itertools import groupby

numbers = ['12345', '12367', '12399']
is_same_start = len(list(groupby(numbers, key=lambda x: x[:3]))) == 1

print(is_same_start)

Output: True

We apply the groupby() method along with a lambda function to check for similar starting digits. The length of the resulting list from groupby() indicates the count of unique starting digits.

Method 4: Using zip() and set()

This approach leverages zip() to compare each digit position across all strings simultaneously. When cast to a set, if at any position the set size is larger than one, we know not all starting digits are similar.

Here’s an example:

numbers = ['12345', '12367', '12399']
is_same_start = all(len(set(characters)) == 1 for characters in zip(*numbers))

print(is_same_start)

Output: True

Here, zip(*numbers) combines the i-th characters of each element, which are then cast to sets. If all such sets have a size of one, this means all starting digits match.

Bonus One-Liner Method 5: Using a List Comprehension and min/max

A one-liner using list comprehension with the min and max functions can quickly check if the starting digits are all identical due to the lexicographical ordering of strings.

Here’s an example:

numbers = ['12345', '12367', '12399']
is_same_start = min(numbers)[:3] == max(numbers)[:3]
print(is_same_start)

Output: True

The one-liner checks whether the smallest and largest elements in the list have identical starting digits. If they do, it implies all the elements in between also share the same starting digits.

Summary/Discussion

  • Method 1: Using a Loop and startswith(). Simple and straightforward. However, this can be inefficient for larger lists as it checks every element.
  • Method 2: Using Slicing and Set. Elegant and efficient due to the uniqueness property of a set. But, requires converting the list to a set.
  • Method 3: Using itertools.groupby(). Offers functional-style programming. It might be less intuitive for beginners and can be slower due to the groupby overhead.
  • Method 4: Using zip() and set(). Clever use of zip for simultaneous comparison. It’s an efficient method but might be slightly harder to understand for new programmers.
  • Bonus One-Liner Method 5: Using a List Comprehension and min/max. Extremely concise. However, it may be less readable and assumes the list is non-empty and has more than one element.