Рубрики
Без рубрики

Как удалить дубликаты из списка списков Python?

https://youtu.be/jzuXwIVRT1s Какой лучший способ удалить дубликаты из списка списков Python? Это популярный опрос кодирующего интервью в Google, Facebook и Amazon. В этой статье я покажу вам, как (а почему) это работает — так продолжай читать! Как удалить все дубликаты данного значения в списке? Метод 1: наивный метод … Как удалить дубликаты из списка списков Python? Подробнее “

Автор оригинала: Chris.

Какой лучший способ удалить дубликаты из списка списков Python? Это популярный опрос кодирующего интервью в Google, Facebook и Amazon. В этой статье я покажу вам, как (и почему) это работает – так что держите чтение!

Как удалить все дубликаты данного значения в списке?

Метод 1: наивный метод

Алгоритм : Перейдите на каждый элемент и проверьте, существует ли этот элемент в списке. Если это так, удалите его. Проблема в том, что этот метод имеет квадратичный Сложность времени Потому что вам нужно проверить каждый элемент, если он существует в списке (что это n * O (n) для N элементы).

lst = [[1, 1], [0, 1], [0, 1], [1, 1]]

dup_free = []
for x in lst:
    if x not in dup_free:
        dup_free.append(x)

print(dup_free)
# [[1, 1], [0, 1]]

Метод 2: Временное преобразование словаря

Алгоритм: Более эффективный способ с точки зрения сложности времени состоит в том, чтобы создать словарь из элементов в списке, чтобы удалить все дубликаты и преобразовывать словарь обратно в список. Это сохраняет порядок исходных элементов списка.

lst = [[1, 1], [0, 1], [0, 1], [1, 1]]

# 1. Convert into list of tuples
tpls = [tuple(x) for x in lst]

# 2. Create dictionary with empty values and
# 3. convert back to a list (dups removed)
dct = list(dict.fromkeys(tpls))

# 4. Convert list of tuples to list of lists
dup_free = [list(x) for x in lst]

# Print everything
print(dup_free)
# [[1, 1], [0, 1], [0, 1], [1, 1]]

Все следующие четыре метода Sub являются операциями в линейном времени. Следовательно, алгоритм имеет линейную сложность времени выполнения и более эффективно, чем наивный подход (метод 1).

  1. Преобразовать в список кортежей, используя Понимание списка [TUPLE (X) для X в LST] Отказ Кортеры ерят и могут быть использованы в качестве списков словаря – в то время как списки не могут!
  2. Преобразуйте список кортежей в словарь с Dict.Fromkeys (TPLS) Чтобы отобразить кортежи к фиктивным значениям. Каждый словарь может существовать только один раз, поэтому дубликаты удаляются в этой точке.
  3. Преобразуйте словарь в список кортежей с Список (...) Отказ
  4. Преобразовать список кортежей в список списков с использованием понимания списка [Список (X) для X в LST] Отказ

Каждый список элементов списка) становится кортежом, который становится новым ключом к словарю. Например, список [[1, 1], [0, 1], [0, 1]] становится списком [(1, 1), (0, 1), (0, 1)] Словарь {(1, 1): нет, (0, 1) : Нет} Отказ Все элементы, которые происходят несколько раз, будут присвоены к тому же ключу. Таким образом, словарь содержит только уникальные ключевые ключи – не могут быть несколько равных клавиш.

В качестве значений словаря вы принимаете фиктивные значения (по умолчанию).

Затем вы преобразуете словарь обратно в список списков, выбрасывающих данные значения.

Связанные статьи в блоге:

  • Список Python Удалить
  • Окончательный гид по словари Python!
  • Удалить дубликаты из списков Python
  • Список списков Python

Словари Python сохраняют упорядочение ключа?

Удивительно, Словары ключей в Python сохраняют порядок элементов . Итак, да, порядок элементов сохраняется. (источник)

Это удивительно для многих читателей, потому что бесчисленные онлайн-ресурсы, такие как Это один утверждают, что порядок ключей словаря не сохранился. Они предполагают, что базовая реализация ключевых словарных ключей использует наборы и множества, хорошо известны, что агностики к упорядочению элементов. Но это предположение не так. Встроенная реализация словаря Python в Cpefhon сохраняет заказ.

Вот пример, не стесняйтесь создавать свои собственные примеры и тесты, чтобы проверить, сохраняется ли упорядочение.

lst = ['Alice', 'Bob', 'Bob', 1, 1, 1, 2, 3, 3]
dic = dict.fromkeys(lst)
print(dic)
# {'Alice': None, 'Bob': None, 1: None, 2: None, 3: None}

Вы видите, что порядок элементов сохраняется так при преобразовании его обратно, исходное упорядочение элементов списка все еще сохраняется:

print(list(dic))
# ['Alice', 'Bob', 1, 2, 3]

Однако вы не можете полагаться на него, потому что любая реализация Python может, теоретически решать не сохранять порядок (обратите внимание, что «может» вот 100% теоретический и не распространяется на реализацию CPYPHON.

Если вам нужно уверены, что заказ сохраняется, вы можете использовать Заказанная библиотека словаря Отказ В CPYthon это просто обертка для реализации Dict Dict.

Метод 3: установить преобразование

Учитывая список списков, цель состоит в том, чтобы удалить все элементы, которые существуют более одного раза в списке.

Наборы в Python позволяют только один экземпляр элемента. Поэтому, преобразуя список на набор, все дубликаты удаляются. В отличие от наивного подхода (проверка всех пар элементов, если они являются дубликатами), что имеет квадратичную сложность времени, этот метод имеет линейную сложность времени выполнения. Почему? Поскольку сложность выполнения создания набора является линейной в количестве установленных элементов. Теперь вы преобразуете установку обратно в список, и Voilà, дубликаты удаляются.

lst = list(range(10)) + list(range(10))
lst = list(set(lst))
print(lst)
# [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

# Does this also work for tuples? Yes!

lst = [(10,5), (10,5), (5,10), (3,2), (3, 4)]
lst = list(set(lst))
print(lst)
# [(3, 4), (10, 5), (5, 10), (3, 2)]

Однако преобразование списка на набор не гарантирует сохранить порядок элементов списка. Набор теряет всю информацию заказа. Кроме того, вы не можете создать набор списков, потому что списки являются немашиными типами данных:

>>> set([[1,2], [1,1]])
Traceback (most recent call last):
  File "", line 1, in 
    set([[1,2], [1,1]])
TypeError: unhashable type: 'list'

Но мы можем найти простой обходной путь к обеим проблемам, как вы увидите в следующем способе.

Метод линейного времени выполнения с установленным для удаления дубликатов из списка списков

Этот третий подход использует набор для проверки, если элемент уже находится в списке дубликатов. Поскольку проверка членства на множествах гораздо быстрее, чем проверка членства в списках, этот метод также имеет сложность линейного времени выполнения (членство имеет постоянную сложность времени выполнения).

lst = [[1, 1], [0, 1], [0, 1], [1, 1]]

dup_free = []
dup_free_set = set()
for x in lst:
    if tuple(x) not in dup_free_set:
        dup_free.append(x)
        dup_free_set.add(tuple(x))

print(dup_free)
# [[1, 1], [0, 1]]

Такой подход удаления дубликатов из списка при сохранении порядка элементов также имеет линейную сложность времени выполнения. И это работает для всех языков программирования без необходимости знать подробности реализации о словаре в Python. Но, с другой стороны, это немного сложнее.

Куда пойти отсюда?

Достаточно теории, давайте познакомимся!

Чтобы стать успешным в кодировке, вам нужно выйти туда и решать реальные проблемы для реальных людей. Вот как вы можете легко стать шестифункциональным тренером. И вот как вы польские навыки, которые вам действительно нужны на практике. В конце концов, что такое использование теории обучения, что никто никогда не нуждается?

Практические проекты – это то, как вы обостряете вашу пилу в кодировке!

Вы хотите стать мастером кода, сосредоточившись на практических кодовых проектах, которые фактически зарабатывают вам деньги и решают проблемы для людей?

Затем станьте питоном независимым разработчиком! Это лучший способ приближения к задаче улучшения ваших навыков Python – даже если вы являетесь полным новичком.

Присоединяйтесь к моему бесплатным вебинаре «Как создать свой навык высокого дохода Python» и посмотреть, как я вырос на моем кодированном бизнесе в Интернете и как вы можете, слишком от комфорта вашего собственного дома.

Присоединяйтесь к свободному вебинару сейчас!

Работая в качестве исследователя в распределенных системах, доктор Кристиан Майер нашел свою любовь к учению студентов компьютерных наук.

Чтобы помочь студентам достичь более высоких уровней успеха Python, он основал сайт программирования образования Finxter.com Отказ Он автор популярной книги программирования Python одноклассники (Nostarch 2020), Coauthor of Кофе-брейк Python Серия самооставленных книг, энтузиаста компьютерных наук, Фрилансера и владелец одного из лучших 10 крупнейших Питон блоги по всему миру.

Его страсти пишут, чтение и кодирование. Но его величайшая страсть состоит в том, чтобы служить стремлению кодер через Finxter и помогать им повысить свои навыки. Вы можете присоединиться к его бесплатной академии электронной почты здесь.

Оригинал: “https://blog.finxter.com/how-to-remove-duplicates-from-a-python-list-of-lists/”