How to Remove Duplicates from a List in Python

Removing duplicates from a list means keeping only one copy of each value.

In Python, there are a few simple ways to do this:

  • Use dict.fromkeys() to remove duplicates and keep the original order
  • Use set() if you only care about unique values
  • Use a loop if you want to understand the logic or need more control

For most beginners, dict.fromkeys() is a good default choice.

Quick fix

items = [1, 2, 2, 3, 1, 4]
unique_items = list(dict.fromkeys(items))
print(unique_items)

Output:

[1, 2, 3, 4]

This removes duplicates and keeps the original order.

What removing duplicates means

A duplicate is a value that appears more than once in a list.

For example:

items = [1, 2, 2, 3, 1, 4]

In this list:

  • 2 appears more than once
  • 1 appears more than once

If you remove duplicates, you keep one copy of each value:

[1, 2, 3, 4]

The important thing to remember is this:

  • Some methods keep the original order
  • Some methods do not keep the original order

If order matters, choose your method carefully.

Use dict.fromkeys() to keep order

This is one of the easiest ways to remove duplicates while keeping the original order.

items = [1, 2, 2, 3, 1, 4]
unique_items = list(dict.fromkeys(items))

print(unique_items)

Output:

[1, 2, 3, 4]

How it works

  • dict.fromkeys(items) creates a dictionary using the list values as keys
  • Dictionary keys must be unique
  • Duplicate values are removed automatically
  • list(...) turns the keys back into a list

This works well for:

  • strings
  • numbers
  • tuples

Example with strings:

names = ["Ana", "Bob", "Ana", "Cara", "Bob"]
unique_names = list(dict.fromkeys(names))

print(unique_names)

Output:

['Ana', 'Bob', 'Cara']

If you want to understand sets better, see Python sets explained and the set() function reference.

Use set() when order does not matter

A set stores only unique values.

That means you can remove duplicates like this:

items = [1, 2, 2, 3, 1, 4]
unique_items = list(set(items))

print(unique_items)

Possible output:

[1, 2, 3, 4]

This method is:

  • short
  • common
  • often fast

But there is one important warning:

  • The final order may not match the original list

For example:

letters = ["b", "a", "c", "a", "b"]
unique_letters = list(set(letters))

print(unique_letters)

The output may be in a different order than the original list.

Use this only when order does not matter.

Use a loop to understand the logic

A loop is easy to read and helps you understand what duplicate removal is doing.

items = [1, 2, 2, 3, 1, 4]
unique_items = []

for item in items:
    if item not in unique_items:
        unique_items.append(item)

print(unique_items)

Output:

[1, 2, 3, 4]

What the code does

  • Start with an empty list called unique_items
  • Loop through each item in the original list
  • Check whether the item is already in unique_items
  • If not, add it with append()

This keeps the original order and is beginner-friendly.

If you want a quick refresher on adding values to lists, see Python list append() method.

When to use this method

Use a loop when:

  • you want to understand the logic clearly
  • your list contains values that do not work well with set() or dict.fromkeys()
  • you need custom rules for what counts as a duplicate

This approach is usually slower for large lists because item not in unique_items checks the list again each time. For small beginner examples, that is often fine.

Handle lists with unhashable items

set() and dict.fromkeys() work best with hashable values such as:

  • strings
  • numbers
  • tuples

Some values are unhashable, including:

  • lists
  • dictionaries

That means this will fail:

items = [[1, 2], [1, 2], [3, 4]]
unique_items = list(set(items))

You will get an error because lists cannot be used as set values.

In cases like this, use a loop:

items = [[1, 2], [1, 2], [3, 4]]
unique_items = []

for item in items:
    if item not in unique_items:
        unique_items.append(item)

print(unique_items)

Output:

[[1, 2], [3, 4]]

Example with dictionaries

A list of dictionaries usually needs a custom rule.

items = [
    {"id": 1, "name": "Ana"},
    {"id": 2, "name": "Bob"},
    {"id": 1, "name": "Ana"}
]

unique_items = []

for item in items:
    if item not in unique_items:
        unique_items.append(item)

print(unique_items)

Output:

[{'id': 1, 'name': 'Ana'}, {'id': 2, 'name': 'Bob'}]

Sometimes you do not want to compare whole dictionaries. You may only want to treat items as duplicates if the "id" matches. In that case, you need a custom check.

Choose the right method

Here is a simple guide:

  • Use dict.fromkeys() if you want to keep order
  • Use set() if order does not matter
  • Use a loop if you want beginner-friendly logic or need custom checks

In short:

  • Best simple default: list(dict.fromkeys(items))
  • Shortest option: list(set(items))
  • Most flexible option: a loop

If you are also checking values before adding them, how to check if a value exists in a list in Python may help.

Common mistakes

Here are some common problems when removing duplicates from a list.

Using set() and expecting the original order to stay the same

This is a very common mistake.

items = [3, 1, 2, 1, 3]
unique_items = list(set(items))
print(unique_items)

The values will be unique, but the order may change.

If you need order, use:

unique_items = list(dict.fromkeys(items))

Trying set() on a list that contains other lists or dictionaries

This will usually fail because lists and dictionaries are unhashable.

Bad example:

items = [[1, 2], [1, 2]]
unique_items = list(set(items))

Use a loop instead.

Removing duplicates without assigning the result

This does not change the original list by itself:

items = [1, 2, 2, 3]
list(dict.fromkeys(items))
print(items)

Output:

[1, 2, 2, 3]

You need to store the result:

items = [1, 2, 2, 3]
unique_items = list(dict.fromkeys(items))
print(unique_items)

Thinking duplicate removal changes the original list automatically

Most duplicate-removal approaches create a new list.

If you want to keep the result, assign it to a variable.

You can also replace the original variable:

items = [1, 2, 2, 3]
items = list(dict.fromkeys(items))
print(items)

If you want to preserve the original list before changing it, see how to copy a list in Python.

Helpful debugging checks

If your result is not what you expected, these checks can help:

print(items)
print(type(items))
print(unique_items)
print(len(items), len(unique_items))
for item in items:
    print(repr(item))

These help you:

  • confirm the input list
  • check the data type
  • compare the original and new lists
  • see whether values only look the same but are actually different

FAQ

How do I remove duplicates and keep the original order?

Use list(dict.fromkeys(your_list)). It is short and keeps order in modern Python.

What is the shortest way to remove duplicates?

Use list(set(your_list)), but only if you do not care about order.

Why did my list change order after removing duplicates?

You probably used set(). Sets do not keep list order.

Can I remove duplicates from a list of dictionaries?

Not directly with set() in most cases. Use a loop and define your own rule for duplicates.

See also