У меня есть два очень больших списка, и для его прокрутки один раз занимает как минимум секунду, и мне нужно сделать это 200 000 раз. Какой самый быстрый способ удалить дубликаты в двух списках, чтобы сформировать один?
Самый быстрый способ удалить дубликаты в списках Python
Ответ 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)))
Вот как я это сделаю. Однако я не уверен в производительности, но это, безусловно, лучше, чем делать это вручную.