Ответы ниже всего кажутся мне неправильными. Что произойдет, если число будет повторяться в любом списке, наверняка вы захотите знать, что (?) (Например, скажем, в обоих списках дважды по 5). Любое решение, использующее наборы, немедленно удалит все повторяющиеся элементы, и вы потеряете эта информация
Внимание, понимание списка не обязательно является более быстрым вариантом. Для больших наборов (где производительность, скорее всего, имеет значение) побитовое сравнение ( &) или set(a).intersection(b)будет таким же быстрым или быстрым, чем понимание списка.
Джошмейкер
24
Еще одно предостережение: понимание списка находит значения, которые появляются в тех же самых позициях (это то, что SilentGhost имел в виду под «порядком важен»). Заданные решения пересечения также найдут совпадения в РАЗНЫХ позициях. Это ответы на 2 совершенно разных вопроса ... (вопрос
опа
Как это сделать, если ваши списки являются списками списков, т.е. a = [[0,0], [1,0]] и b = [[2,3], [0,0]]
Schneems
3
Какова будет временная сложность первого примера set(a) & set(b)?
АдъюнктПрофессорФалькон
Обратите внимание, что это не работает, если оба набора пусты, и вы ожидаете, что сравнение пройдет. Поэтому измените на «(установите (а) и установите (б)) или (не а и не б)»
Этот ответ имеет хорошую алгоритмическую производительность, поскольку только один из списков (более короткий должен быть предпочтительным) превращается в набор для быстрого поиска, а другой список просматривается при поиске его элементов в наборе.
u0b34a0f6ae
18
bool(set(a).intersection(b))для TrueилиFalse
Акшай
6
Этот ответ является более гибким и читаемым, так как люди могут нуждаться differenceили union.
Шихе Чжан
Что, если у меня есть объекты в качестве элементов списка и я хочу только частичное совпадение, т. Е. Только некоторые атрибуты должны совпадать, чтобы он считался соответствующим объектом?
CGFoX,
Есть ли разница в производительности для .intersection()против &?
brandonbanks
106
Быстрый тест производительности, показывающий решение Лутца, является лучшим:
import time
def speed_test(func):def wrapper(*args,**kwargs):
t1 = time.time()for x in xrange(5000):
results = func(*args,**kwargs)
t2 = time.time()print'%s took %0.3f ms'%(func.func_name,(t2-t1)*1000.0)return results
return wrapper
@speed_testdef compare_bitwise(x, y):
set_x = frozenset(x)
set_y = frozenset(y)return set_x & set_y
@speed_testdef compare_listcomp(x, y):return[i for i, j in zip(x, y)if i == j]@speed_testdef compare_intersect(x, y):return frozenset(x).intersection(y)# Comparing short lists
a =[1,2,3,4,5]
b =[9,8,7,6,5]
compare_bitwise(a, b)
compare_listcomp(a, b)
compare_intersect(a, b)# Comparing longer listsimport random
a = random.sample(xrange(100000),10000)
b = random.sample(xrange(100000),10000)
compare_bitwise(a, b)
compare_listcomp(a, b)
compare_intersect(a, b)
Вот результаты на моей машине:
# Short list:
compare_bitwise took 10.145 ms
compare_listcomp took 11.157 ms
compare_intersect took 7.461 ms
# Long list:
compare_bitwise took 11203.709 ms
compare_listcomp took 17361.736 ms
compare_intersect took 6833.768 ms
Очевидно, что любой искусственный тест производительности следует проводить с небольшим количеством соли, но, поскольку set().intersection()ответ по крайней мере так же быстр, как и другие решения, а также наиболее читаемый, он должен быть стандартным решением для этой распространенной проблемы.
Набор фактически удаляет повторы, поэтому в моем случае это не сработает
rgralma
@rgralma создание нового setиз существующего listничего не удалит из оригинала list. Если вы хотите, чтобы специальная логика обрабатывала дубликаты в списке, я думаю, вам нужно задать новый вопрос, потому что ответ должен быть конкретным для того, как вы хотите обрабатывать дубликаты.
Джошмейкер
67
Я предпочитаю ответы на основе набора, но вот тот, который работает в любом случае
Согласно документу - ... исключаются подверженные ошибкам конструкции, такие как Set ('abc') и 'cbs', в пользу более читабельного Set ('abc'). Intersection ('cbs'). - docs.python.org/library/sets.html
Аарон Ньютон
5
еще один более функциональный способ проверить равенство списка для списка 1 (lst1) и списка 2 (lst2), где объекты имеют глубину один и который сохраняет порядок:
Хотя этот код может ответить на вопрос, предоставление дополнительного контекста относительно того, как и / или почему он решает проблему, улучшит долгосрочную ценность ответа.
Дональд Дак
4
Можно также использовать itertools.product.
>>> common_elements=[]>>>for i in list(itertools.product(a,b)):...if i[0]== i[1]:... common_elements.append(i[0])
you can |for set union and&for set intersection.for example:
set1={1,2,3}
set2={3,4,5}print(set1&set2)
output=3
set1={1,2,3}
set2={3,4,5}print(set1|set2)
output=1,2,3,4,5
curly braces in the answer.
Ответы:
Не самый эффективный, но самый очевидный способ сделать это:
если порядок значительный, вы можете сделать это с помощью списков:
(работает только для списков одинакового размера, что подразумевает значимость порядка).
источник
&
) илиset(a).intersection(b)
будет таким же быстрым или быстрым, чем понимание списка.set(a) & set(b)
?Используйте set.intersection () , это быстро и читабельно.
источник
bool(set(a).intersection(b))
дляTrue
илиFalse
difference
илиunion
..intersection()
против&
?Быстрый тест производительности, показывающий решение Лутца, является лучшим:
Вот результаты на моей машине:
Очевидно, что любой искусственный тест производительности следует проводить с небольшим количеством соли, но, поскольку
set().intersection()
ответ по крайней мере так же быстр, как и другие решения, а также наиболее читаемый, он должен быть стандартным решением для этой распространенной проблемы.источник
set
из существующегоlist
ничего не удалит из оригиналаlist
. Если вы хотите, чтобы специальная логика обрабатывала дубликаты в списке, я думаю, вам нужно задать новый вопрос, потому что ответ должен быть конкретным для того, как вы хотите обрабатывать дубликаты.Я предпочитаю ответы на основе набора, но вот тот, который работает в любом случае
источник
Самый простой способ сделать это - использовать наборы :
источник
Быстрый способ:
источник
источник
Также вы можете попробовать это, сохранив общие элементы в новом списке.
источник
Хотите дубликаты? Если нет, то, возможно, вам следует использовать наборы вместо:
источник
еще один более функциональный способ проверить равенство списка для списка 1 (lst1) и списка 2 (lst2), где объекты имеют глубину один и который сохраняет порядок:
источник
источник
Можно также использовать itertools.product.
источник
Ты можешь использовать
источник
Ты можешь использовать:
Вывод:
источник
Если вы хотите логическое значение:
источник
Следующее решение работает для любого порядка элементов списка, а также поддерживает оба списка разной длины.
источник
np.intersect1d(list1, list2)
Использование
__and__
атрибутного метода также работает.или просто
источник
источник
&
оператора на множестве уже ответ SilentGhost в принятом ответеЯ просто использовал следующее, и это сработало для меня:
это тогда напечатало бы 5 в вашем случае. Вероятно, не очень хорошая производительность, хотя.
источник