Check if a List Contains Only Unique Elements

problem-solving
Published

February 18, 2023

Python offers several elegant ways to determine if a list contains only unique elements, meaning no element is repeated. This is a common task in data processing and programming challenges. This post will explore different approaches, highlighting their efficiency and readability.

Method 1: Using a Set

The most Pythonic and efficient method leverages the properties of sets. Sets, by definition, only contain unique elements. Converting a list to a set and then comparing the lengths is a concise and fast solution.

def is_unique_set(data):
  """
  Checks if a list contains only unique elements using sets.

  Args:
    data: A list of elements.

  Returns:
    True if the list contains only unique elements, False otherwise.
  """
  return len(data) == len(set(data))

#Example Usage
my_list = [1, 2, 3, 4, 5]
print(f"List {my_list} contains only unique elements: {is_unique_set(my_list)}")  # Output: True

my_list = [1, 2, 3, 4, 5, 1]
print(f"List {my_list} contains only unique elements: {is_unique_set(my_list)}")  # Output: False

This approach has a time complexity of O(n), where n is the length of the list, due to the set creation.

Method 2: Using a Loop and a Dictionary (or List)

For educational purposes, or if you need finer control over the process, a loop-based approach is valuable. This method iterates through the list, keeping track of seen elements in a dictionary (or a list).

def is_unique_loop(data):
  """
  Checks if a list contains only unique elements using a loop and a dictionary.

  Args:
    data: A list of elements.

  Returns:
    True if the list contains only unique elements, False otherwise.
  """
  seen = {} #or seen = [] for list implementation
  for item in data:
    if item in seen:
      return False
    seen[item] = True #or seen.append(item) for list implementation
  return True


#Example Usage
my_list = [1, 2, 3, 4, 5]
print(f"List {my_list} contains only unique elements: {is_unique_loop(my_list)}")  # Output: True

my_list = [1, 2, 3, 4, 5, 1]
print(f"List {my_list} contains only unique elements: {is_unique_loop(my_list)}")  # Output: False

The time complexity of this method is also O(n) in the average case for dictionary implementation and O(n^2) in the worst case for list implementation, making the set-based approach generally preferred for its efficiency.

Method 3: Using Counter from collections

The Counter object from the collections module provides a convenient way to count the occurrences of each element in a list.

from collections import Counter

def is_unique_counter(data):
  """
  Checks if a list contains only unique elements using Counter.

  Args:
    data: A list of elements.

  Returns:
    True if the list contains only unique elements, False otherwise.
  """
  counts = Counter(data)
  return all(count == 1 for count in counts.values())

#Example Usage
my_list = [1, 2, 3, 4, 5]
print(f"List {my_list} contains only unique elements: {is_unique_counter(my_list)}")  # Output: True

my_list = [1, 2, 3, 4, 5, 1]
print(f"List {my_list} contains only unique elements: {is_unique_counter(my_list)}")  # Output: False

This approach is also O(n) in terms of time complexity.

Choosing the best method depends on your specific needs. For most cases, the set-based approach (is_unique_set) offers the best combination of readability and efficiency. The loop-based approach provides more control, while the Counter method offers a slightly different perspective on the problem.