Сравнение общих элементов между 2 списками - PullRequest
96 голосов
/ 19 мая 2010
def common_elements(list1, list2):
    """
    Return a list containing the elements which are in both list1 and list2

    >>> common_elements([1,2,3,4,5,6], [3,5,7,9])
    [3, 5]
    >>> common_elements(['this','this','n','that'],['this','not','that','that'])
    ['this', 'that']
    """
    for element in list1:
        if element in list2:
            return list(element)

Понял, но пока не могу заставить его работать!

Есть идеи?

Ответы [ 17 ]

186 голосов
/ 19 мая 2010
>>> list1 = [1,2,3,4,5,6]
>>> list2 = [3, 5, 7, 9]
>>> list(set(list1).intersection(list2))
[3, 5]
39 голосов
/ 23 июля 2016

Вы также можете использовать наборы и получить общие черты в одной строке: вычтите набор, содержащий отличия от одного из наборов.

A = [1,2,3,4]
B = [2,4,7,8]
commonalities = set(A) - (set(A) - set(B))
31 голосов
/ 19 мая 2010

Решения, предложенные S.Mark и SilentGhost , обычно говорят вам, как это должно быть сделано на Pythonic, но я подумал, что вам также может быть полезно узнать, почему ваше решение не не работает Проблема в том, что как только вы найдете первый общий элемент в двух списках, вы возвращаете только этот единственный элемент. Ваше решение можно исправить, создав список result и собрав общие элементы в этом списке:

def common_elements(list1, list2):
    result = []
    for element in list1:
        if element in list2:
            result.append(element)
    return result

Еще более короткая версия с использованием списочных представлений:

def common_elements(list1, list2):
    return [element for element in list1 if element in list2]

Однако, как я уже сказал, это очень неэффективный способ сделать это - встроенные типы наборов Python намного более эффективны, поскольку они реализованы внутри C.

25 голосов
/ 19 мая 2010

использовать набор пересечений, набор (список1) и набор (список2)

>>> def common_elements(list1, list2):
...     return list(set(list1) & set(list2))
...
>>>
>>> common_elements([1,2,3,4,5,6], [3,5,7,9])
[3, 5]
>>>
>>> common_elements(['this','this','n','that'],['this','not','that','that'])
['this', 'that']
>>>
>>>

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

10 голосов
/ 28 марта 2018

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

x=[1,2,3,4]
y=[3,4,5]
common = [i for i in x if i in y]
common: [3,4]
10 голосов
/ 20 марта 2014

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

l2, common = l2[:], [ e for e in l1 if e in l2 and (l2.pop(l2.index(e)) or True)]

Часть or True необходима только в том случае, если вы ожидаете, что какой-либо элемент оценивается как False.

4 голосов
/ 16 октября 2018

это мое предложение я думаю, что это проще с наборами, чем с циклом

def unique_common_items(list1, list2):
   # Produce the set of *unique* common items in two lists.
   return list(set(list1) & set(list2))
3 голосов
/ 25 ноября 2018

Набор - это еще один способ решить эту проблему

a = [3,2,4]
b = [2,3,5]
set(a)&set(b)
{2, 3}
2 голосов
/ 12 августа 2015

1) Метод1 сохранение list1 - это словарь, а затем повторение каждого элемента в list2

def findarrayhash(a,b):
    h1={k:1 for k in a}
    for val in b:
        if val in h1:
            print("common found",val)
            del h1[val]
        else:
            print("different found",val)
    for key in h1.iterkeys():
        print ("different found",key)

Поиск общих и разных элементов:

2) Метод2 используя set

def findarrayset(a,b):
    common = set(a)&set(b)
    diff=set(a)^set(b)
    print list(common)
    print list(diff) 
2 голосов
/ 27 марта 2019

Используйте генератор:

common = (x for x in list1 if x in list2)

Преимущество здесь в том, что он будет возвращаться в постоянное время (почти мгновенно) даже при использовании огромных списков или других огромных итераций.

Например,

list1 =  list(range(0,10000000))
list2=list(range(1000,20000000))
common = (x for x in list1 if x in list2)

Все остальные ответы здесь займут очень много времени с этими значениями для list1 и list2.

Затем вы можете повторить ответ с помощью

for i in common: print(i)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...