Как сравнить два списка в 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

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

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]

Ответ 5

Самый простой способ сделать это - использовать sets:

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

Ответ 6

Быстрый способ:

list(set(a).intersection(set(b)))

Ответ 7

>>> s = ['a','b','c']   
>>> f = ['a','b','d','c']  
>>> ss= set(s)  
>>> fs =set(f)  
>>> print ss.intersection(fs)   
   **set(['a', 'c', 'b'])**  
>>> print ss.union(fs)        
   **set(['a', 'c', 'b', 'd'])**  
>>> print ss.union(fs)  - ss.intersection(fs)   
   **set(['d'])**

Ответ 8

Также вы можете попробовать это, сохранив общие элементы в новом списке.

new_list = []
for element in a:
    if element in b:
        new_list.append(element)

Ответ 9

Вы хотите дублировать? Если нет, возможно, вы должны использовать наборы вместо:


>>> set([1, 2, 3, 4, 5]).intersection(set([9, 8, 7, 6, 5]))
set([5])

Ответ 10

Вы можете использовать

def returnMatches(a,b):
       return list(set(a) & set(b))

Ответ 11

Может также использовать itertools.product.

>>> common_elements=[]
>>> for i in list(itertools.product(a,b)):
...   if i[0] == i[1]:
...       common_elements.append(i[0])

Ответ 12

Вы можете использовать:

a = [1, 3, 4, 5, 9, 6, 7, 8]
b = [1, 7, 0, 9]
same_values = set(a) & set(b)
print same_values

Вывод:

set([1, 7, 9])

Ответ 13

еще один более функциональный способ проверки правильности списка для списка 1 (lst1) и списка 2 (lst2), где объекты имеют глубину 1 и которая сохраняет порядок:

all(i == j for i, j in zip(lst1, lst2))   

Ответ 14

Если вы хотите логическое значение:

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

Ответ 15

Использование метода атрибута __and__ также работает.

>>> a = [1, 2, 3, 4, 5]
>>> b = [9, 8, 7, 6, 5]
>>> set(a).__and__(set(b))
set([5])

или просто

>>> set([1, 2, 3, 4, 5]).__and__(set([9, 8, 7, 6, 5]))
set([5])
>>>    

Ответ 16

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

lista =set(a)
listb =set(b)   
print listb.intersection(lista)   
returnMatches = set(['5']) #output 

print " ".join(str(return) for return in returnMatches ) # remove the set()   

 5        #final output