Вопрос-Ответ

How can I compare two lists in python and return matches [duplicate]

Как я могу сравнить два списка в python и вернуть совпадения

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

a = [1, 2, 3, 4, 5]
b = [9, 8, 7, 6, 5]

returnMatches(a, b)

вернет [5].

Переведено автоматически
Ответ 1

Не самый эффективный, но, безусловно, самый очевидный способ сделать это:

>>> a = [1, 2, 3, 4, 5]
>>> b = [9, 8, 7, 6, 5]
>>> set(a) & set(b)
{5}

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

>>> [i for i, j in zip(a, b) if i == j]
[5]

(работает только для списков одинакового размера, что подразумевает значение порядка).

Ответ 2

Используйте set.intersection(), это быстро и читаемо.

>>> set(a).intersection(b)
set([5])
Ответ 3

Быстрый тест производительности показывает, что решение Лутца является лучшим:

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_test
def compare_bitwise(x, y):
set_x = frozenset(x)
set_y = frozenset(y)
return set_x & set_y

@speed_test
def compare_listcomp(x, y):
return [i for i, j in zip(x, y) if i == j]

@speed_test
def 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 lists
import 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() ответпо крайней мере такой же быстрый, как и другие решения, а также наиболее читаемый, он должен быть стандартным решением для этой распространенной проблемы.

Ответ 4

Я предпочитаю ответы на основе набора, но вот тот, который работает в любом случае

[x for x in a if x in b]
python list