How to convert a list to a set in Python

Discover multiple ways to convert a list to a set in Python. Explore tips, applications, and how to debug common conversion errors.

How to convert a list to a set in Python
Published on: 
Thu
Feb 12, 2026
Updated on: 
Tue
Feb 24, 2026
The Replit Team Logo Image
The Replit Team

Python developers often convert lists to sets to remove duplicates and improve performance. The built-in set() constructor makes this process simple and efficient.

In this article, we'll explore various conversion techniques and performance tips for large datasets. You'll also find real-world applications and debugging advice to help you resolve common errors with confidence.

Basic conversion with the set() constructor

my_list = [1, 2, 3, 2, 1, 4]
my_set = set(my_list)
print(my_set)--OUTPUT--{1, 2, 3, 4}

The set() constructor is the most direct way to convert a list. It works by iterating through my_list and adding each element to a new set. Because sets inherently store only unique values, any duplicate elements like the second 1 and 2 are automatically discarded during this process.

The resulting my_set is an unordered collection of the unique items from the original list. This behavior isn't just a feature—it's the core mathematical definition of a set, making it a highly efficient tool for deduplication.

Basic set conversion techniques

While the set() constructor is the go-to for simple conversions, Python provides other powerful techniques for more specific scenarios.

Using set comprehension

my_list = [1, 2, 3, 2, 1, 4]
my_set = {item for item in my_list}
print(my_set)--OUTPUT--{1, 2, 3, 4}

Set comprehension offers a concise syntax that’s similar to list comprehensions—the key difference is the use of curly braces {}. This expression iterates through each item in my_list and adds it to the new set, automatically handling duplicates just like the constructor.

Its real power comes from its flexibility. Unlike the basic set() constructor, set comprehension allows you to:

  • Transform each item before adding it to the set.
  • Filter elements by adding a conditional if clause.

Using the unpacking operator *

my_list = [1, 2, 3, 2, 1, 4]
my_set = {*my_list}
print(my_set)--OUTPUT--{1, 2, 3, 4}

The unpacking operator * offers a visually clean syntax for this conversion. It takes every item from my_list and expands them inside the curly braces {}. Python then collects these individual elements into a new set, which naturally handles the removal of duplicates.

  • This method is functionally equivalent to using the set() constructor.
  • Its main advantage is its modern, declarative style, which many developers find more readable.

Converting with frozenset()

my_list = [1, 2, 3, 2, 1, 4]
my_frozen_set = frozenset(my_list)
print(my_frozen_set)
print(type(my_frozen_set))--OUTPUT--frozenset({1, 2, 3, 4})
<class 'frozenset'>

The frozenset() constructor creates an immutable, or unchangeable, version of a set. It removes duplicates just like a regular set(), but you can't modify it after it's created. This immutability is its key feature.

  • Because it's unchangeable, a frozenset is hashable.
  • This means you can use it as a dictionary key or as an item inside another set—something that isn't possible with a mutable set.

Advanced set conversion techniques

Beyond simple deduplication, you can combine conversion with filtering, handle complex objects, and transform elements using functions like map() with set().

Converting and filtering in one step

my_list = [1, 2, 3, 2, 1, 4, None, 0, ""]
my_set = {x for x in my_list if x is not None and x != ""}
print(my_set)--OUTPUT--{0, 1, 2, 3, 4}

Set comprehension’s real power shines when you add a conditional if clause. This lets you filter elements during the conversion, creating a cleaner set in a single step. The expression acts as a gatekeeper, checking each item before it's added.

In this case, the condition if x is not None and x != "" ensures that only items meeting both criteria make it into the final set.

  • This effectively removes None values and empty strings from the output.

This approach is incredibly efficient for cleaning data while also handling deduplication.

Converting lists with duplicate objects

class Person:
def __init__(self, name):
self.name = name
def __hash__(self):
return hash(self.name)
def __eq__(self, other):
return self.name == other.name

people = [Person("Alice"), Person("Bob"), Person("Alice")]
unique_people = set(people)
print(len(people), "->", len(unique_people))--OUTPUT--3 -> 2

When working with custom objects, you need to tell Python how to identify duplicates. A set requires its items to be hashable, which isn't the default for custom classes. To solve this, you must implement two special methods in your object's class definition.

  • The __hash__() method provides a unique identifier for an object, making it suitable for storage in a set.
  • The __eq__() method defines the logic for equality. In this case, two Person objects are considered equal if their name attributes match.

By defining these methods, you enable the set() constructor to correctly identify and discard the duplicate Person("Alice") object from the list.

Using map() with set() for transformation

my_list = ["1", "2", "3", "2", "1", "4"]
my_set = set(map(int, my_list))
print(my_set)
print(sum(my_set)) # Can now perform numeric operations--OUTPUT--{1, 2, 3, 4}
10

The map() function is a clean way to transform each item in a list before converting it. It applies a given function—in this case, int—to every element in my_list. The set() constructor then takes the resulting map object and builds a set from it, handling deduplication automatically.

  • This approach efficiently converts string numbers to integers in a single, readable line.
  • Once transformed, the set contains numeric values, so you can perform mathematical operations like sum() directly on it.

Move faster with Replit

Replit is an AI-powered development platform that transforms natural language into working applications. Describe what you want to build, and Replit Agent creates it—complete with databases, APIs, and deployment.

For the list-to-set conversion methods we've covered, Replit Agent can turn them into production-ready tools:

  • Build a tag management tool that takes a list of user-generated tags and returns a clean, unique set.
  • Create a data cleaning utility that processes a list of email signups, removing duplicates and filtering out invalid entries in one step.
  • Deploy a simple analytics dashboard that identifies unique visitors from a raw list of session IDs.

Try Replit Agent and see how quickly you can go from an idea to a deployed app.

Common errors and challenges

Converting lists to sets is usually straightforward, but you can run into a few common pitfalls, especially when working with complex data types.

Handling mutable objects in set() conversion

You'll get a TypeError: unhashable type if you try to convert a list containing mutable (changeable) items, like other lists or dictionaries. Sets require their elements to be hashable, meaning they must have a fixed value that never changes. Since a list can be modified, it can't be reliably stored in a set.

  • The fix is to convert mutable elements into their immutable counterparts before adding them to the set.
  • For example, you can turn a list of lists into a set of tuples, since tuples are immutable: set(tuple(item) for item in my_list_of_lists).

Implementing __hash__ and __eq__ for custom objects in sets

By default, your own custom objects are also unhashable, leading to the same TypeError. As we saw earlier with the Person class, you need to tell Python how to handle your objects in a set. You do this by implementing two special methods in your class definition.

  • The __hash__() method gives each object a unique, constant identifier for the set to use.
  • The __eq__() method defines what it means for two of your objects to be equal, which is how the set identifies duplicates.

Handling type errors with mixed data in sets

While a set can hold mixed data types like integers and strings, this can cause a TypeError later on. The error doesn't happen during the conversion itself but when you try to perform an operation that isn't supported across all the types in the set.

For instance, you can't sort a set that contains both numbers and strings because Python doesn't know how to compare them. To avoid this, it's best to ensure your data is uniform before performing operations that depend on type—or filter the set to work with one type at a time.

Handling mutable objects in set() conversion

A set can only contain immutable—or unchangeable—elements. If you try to convert a list that contains a mutable item like another list, Python will raise a TypeError because the inner list isn't hashable. See what happens when we try it.

my_items = [1, 2, [3, 4], 5]
my_set = set(my_items) # This will raise TypeError
print(my_set)

The set() constructor fails because it encounters the list [3, 4], which is mutable. Set elements must be unchangeable, so Python can't hash the inner list, triggering the error. The following code shows how to resolve this.

my_items = [1, 2, [3, 4], 5]
my_set = {item for item in my_items if isinstance(item, (int, str, tuple))}
print(my_set) # {1, 2, 5}

This fix uses a set comprehension to selectively build the new set. The if isinstance(...) clause acts as a filter, allowing only immutable types like integers, strings, and tuples to pass through. This effectively skips the mutable list [3, 4], which would otherwise cause a TypeError. You'll often encounter this issue when processing complex data, such as nested lists or JSON objects, where mutable collections can be hidden inside your main list.

Implementing __hash__ and __eq__ for custom objects in sets

By default, Python doesn't know how to identify duplicate custom objects, so it treats every instance as unique. This happens because sets need a way to compare items, which requires defining the __hash__ and __eq__ methods in your class.

When you skip this step, the set conversion doesn't remove duplicates as you'd expect. See what happens when we try to convert a list of User objects without these methods defined.

class User:
def __init__(self, id, name):
self.id = id
self.name = name

users = [User(1, "Alice"), User(1, "Alice"), User(2, "Bob")]
unique_users = set(users)
print(len(users), "->", len(unique_users)) # 3 -> 3

The set() conversion fails to remove the duplicate User(1, "Alice") because Python compares object memory locations, not their attributes. Each instance is treated as unique. See how to fix this in the code below.

class User:
def __init__(self, id, name):
self.id = id
self.name = name

def __hash__(self):
return hash(self.id)

def __eq__(self, other):
if not isinstance(other, User):
return False
return self.id == other.id

users = [User(1, "Alice"), User(1, "Alice"), User(2, "Bob")]
unique_users = set(users)
print(len(users), "->", len(unique_users)) # 3 -> 2

The fix is to teach Python how to compare your User objects. You do this by implementing two special methods in the class definition:

  • The __hash__() method gives each object a unique identifier based on its id, making it hashable.
  • The __eq__() method defines equality, telling the set that two users are the same if their IDs match.

This gives set() the rules it needs to correctly identify and discard duplicates. You'll need this logic anytime you're deduplicating custom objects from a database or API.

Handling type errors with mixed data in sets

A set can hold mixed data types, but you'll get a TypeError if you perform an operation that isn't supported across all of them. For example, Python can't add numbers and strings. See what happens when we try using sum().

data = [1, "2", 3, "4"]
total = sum(set(data)) # This will raise TypeError
print(total)

The sum() function raises a TypeError because it can't perform addition on mixed types. It successfully adds the first integer but fails when it tries to add that result to a string like "2". The code below shows how to fix this.

data = [1, "2", 3, "4"]
numeric_set = {int(x) for x in data}
total = sum(numeric_set)
print(total) # 10

The fix uses a set comprehension to build a new set where every item is an integer. The expression {int(x) for x in data} applies the int() function to each element, converting strings to numbers.

  • This creates a uniform set of numeric values, so operations like sum() can execute without a TypeError.

You'll often see this when processing data from files or APIs where numbers might be represented as strings.

Real-world applications

Beyond theory, these conversion techniques solve practical data challenges, like preserving order during deduplication or finding common elements between datasets.

Finding unique elements while preserving order with dict.fromkeys()

Unlike a standard set(), which scrambles the order of your items, the dict.fromkeys() method lets you remove duplicates while preserving the original sequence.

# Real-world scenario: Preserving order of unique user IDs
user_logs = [101, 102, 101, 103, 102, 104, 101]
unique_ordered_users = list(dict.fromkeys(user_logs))
print(f"Original logs: {user_logs}")
print(f"Unique ordered users: {unique_ordered_users}")

This technique uses a clever dictionary feature for ordered deduplication. The dict.fromkeys() method creates a dictionary where each item from your list becomes a key. Since dictionary keys must be unique, duplicates are automatically discarded as the dictionary is built.

  • As of Python 3.7, dictionaries preserve the insertion order of their keys.
  • Wrapping the result in list() simply converts these ordered, unique keys back into a list.

This gives you a clean list with the original order intact, which is perfect for processing event logs or user activity streams.

Using set operations for finding common elements in datasets

Sets are incredibly efficient for comparing datasets, letting you find shared items with intersection() or isolate unique elements with the subtraction operator (-).

# Finding common interests between two users
user1_interests = {"python", "data science", "hiking", "music"}
user2_interests = {"java", "python", "gaming", "music"}

common_interests = user1_interests.intersection(user2_interests)
unique_to_user1 = user1_interests - user2_interests

print(f"Common interests: {common_interests}")
print(f"Interests unique to user1: {unique_to_user1}")

This code demonstrates powerful set logic for data analysis. The intersection() method returns a new set containing only the elements that user1_interests and user2_interests have in common. Think of it as finding the overlap between two groups.

  • Conversely, the subtraction operator (-) calculates the difference between two sets.
  • It returns elements from the left set (user1_interests) that are not present in the right, effectively showing what's unique to the first user.

Get started with Replit

Turn these techniques into a real tool. Describe what you want, like “a utility that finds common followers between two user lists” or “an app that deduplicates a list of keywords while preserving order.”

Replit Agent will write the code, test for errors, and deploy your app. Start building with Replit.

Get started free

Create and deploy websites, automations, internal tools, data pipelines and more in any programming language without setup, downloads or extra tools. All in a single cloud workspace with AI built in.

Get started for free

Create & deploy websites, automations, internal tools, data pipelines and more in any programming language without setup, downloads or extra tools. All in a single cloud workspace with AI built in.