Подтвердить что ты не робот

Самый быстрый способ удалить дубликаты в списках Python

У меня есть два очень больших списка, и для его прокрутки один раз занимает как минимум секунду, и мне нужно сделать это 200 000 раз. Какой самый быстрый способ удалить дубликаты в двух списках, чтобы сформировать один?

4b9b3361

Ответ 1

Это самый быстрый способ, о котором я могу думать:

import itertools
output_list = list(set(itertools.chain(first_list, second_list)))

Небольшое обновление. Как указано jcd, в зависимости от вашего приложения вам, вероятно, не нужно преобразовывать результат в список. Поскольку множество итераций само по себе, вы можете просто использовать его непосредственно:

output_set = set(itertools.chain(first_list, second_list))
for item in output_set:
    # do something

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

Ответ 2

Я бы рекомендовал что-то вроде этого:

def combine_lists(list1, list2):
    s = set(list1)
    s.update(list2)
    return list(s)

Это устраняет проблему создания списка монстров конкатенации первых двух.

В зависимости от того, что вы делаете с выходом, не передумайте конвертировать обратно в список. Если заказ очень важен, вам может понадобиться какой-то украшающий /sort/undecorate shenanigans.

Ответ 3

Как утверждает Дэниел, набор не может содержать повторяющиеся записи - так объединяйте списки:

list1 + list2

Затем преобразуйте новый список в набор:

set(list1 + list2)

Затем вернитесь к списку:

list(set(list1 + list2))

Ответ 4

result = list(set(list1).union(set(list2)))

Вот как я это сделаю. Однако я не уверен в производительности, но это, безусловно, лучше, чем делать это вручную.