Подтвердить что ты не робот

Сравнение общих элементов между 2 списками

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)

До сих пор, но не могу заставить его работать!

Есть идеи?

4b9b3361

Ответ 1

>>> list1 = [1,2,3,4,5,6]
>>> list2 = [3, 5, 7, 9]
>>> list(set(list1).intersection(list2))
[3, 5]

Ответ 2

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

A = [1,2,3,4]
B = [2,4,7,8]
commonalities = set(A) - (set(A) - set(B))

Ответ 3

Решения, предлагаемые 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 внутри.

Ответ 4

используйте множество пересечений, установите (list1) и установите (list2)

>>> 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']
>>>
>>>

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

Ответ 5

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

x=[1,2,3,4]
y=[3,4,5]
common = [i for i in x if i in y]
common: [3,4]

Ответ 6

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

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

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

Ответ 7

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

def unique_common_items(list1, list2):
   # Produce the set of *unique* common items in two lists.
   return list(set(list1) & set(list2))

Ответ 8

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

a = [3,2,4]
b = [2,3,5]
set(a)&set(b)
{2, 3}

Ответ 9

1) Method1, сохраняющий 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 с использованием набора

def findarrayset(a,b):
    common = set(a)&set(b)
    diff=set(a)^set(b)
    print list(common)
    print list(diff) 

Ответ 10

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

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)

Ответ 11

Вот довольно грубый метод, с которым я столкнулся. Это, конечно, не самое эффективное, но это что-то.

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

#finds common elements
def common(list1, list2):
    result = []
    intersect = list(set(list1).intersection(list2))

    #using the intersection, find the min
    count1 = 0
    count2 = 0
    for i in intersect: 
        for j in list1:
            if i == j:
                count1 += 1
        for k in list2: 
            if i == k:
                count2 += 1
        minCount = min(count2,count1)
        count1 = 0
        count2 = 0

        #append common factor that many times
        for j in range(minCount):
            result.append(i)

    return result

Ответ 12

a_list = range(1,10)
b_list = range(5, 25)
both = []

for i in b_list:
    for j in a_list:
        if i == j:
            both.append(i)

Ответ 13

f_list=[1,2,3,4,5] # First list
s_list=[3,4,5,6,7,8] # Second list
# An empty list stores the common elements present in both the list
common_elements=[]

for i in f_list:
    # checking if each element of first list exists in second list
    if i in s_list:
        #if so add it in common elements list
        common_elements.append(i) 
print(common_elements)

Ответ 14

Привет, это мое предложение (очень просто)

import random

i = [1,4,10,22,44,6,12] #first random list, could be change in the future
j = [1,4,10,8,15,14] #second random list, could be change in the future
for x in i: 
    if x in j: #for any item 'x' from collection 'i', find the same item in collection of 'j'
        print(x) # print out the results

Ответ 15

def common_member(a, b): 
    a_set = set(a) 
    b_set = set(b) 
    if (a_set & b_set): 
        print(a_set & b_set) 
    else: 
        print("No common elements") 

Ответ 16

list_1=range(0,100)
list_2=range(0,100,5)
final_list=[]
for i in list_1:
    for j in list_2:
        if i==j:
            final_list.append(i)
print(set(final_list))

Ответ 17

Ваша проблема в том, что вы возвращаетесь из цикла for, поэтому вы получите только первое совпадение. Решение состоит в том, чтобы переместить ваше возвращение за пределы цикла.

def elementosEnComunEntre(lista1,lista2):

    elementosEnComun = set()

    for e1 in lista1:
         if(e1 in lista2):
             elementosEnComun.add(e1)

    return list(elementosEnComun)

Ответ 18

import numpy as np
np.intersect1d([1, 3, 4, 3], [3, 1, 2, 1])
array([1, 3])

Ответ 19

def list_common_elements(l_1,l_2,_unique=1,diff=0):
    if not diff:
        if _unique:
            return list(set(l_1)&set(l_2))
        if not _unique:
            return list((i for i in l_1 if i in l_2))
    if diff:
        if _unique:
            return list(set(l_1)^set(l_2))
        if not _unique:
            return list((i for i in l_1 if i not in l_2))
"""
Example:
l_1=             [0, 1, 2, 3, 3, 4, 5]
l_2=             [6, 7, 8, 8, 9, 5, 4, 3, 2]
look for diff
l_2,l_1,diff=1,_unique=1: [0, 1, 6, 7, 8, 9]        sorted(unique(L_2 not in L_1) + unique(L_1 not in L_2))
l_2,l_1,diff=1,_unique=0: [6, 7, 8, 8, 9]           L_2 not in L_1
l_1,l_2,diff=1,_unique=1: [0, 1, 6, 7, 8, 9]        sorted(unique(L_1 not in L_2) + unique(L_2 not in L_1))
l_1,l_2,diff=1,_unique=0: [0, 1]                    L_1 not in L_2
look for same
l_2,l_1,diff=0,_unique=1: [2, 3, 4, 5]              unique(L2 in L1)
l_2,l_1,diff=0,_unique=0: [5, 4, 3, 2]              L2 in L1
l_1,l_2,diff=0,_unique=1: [2, 3, 4, 5]              unique(L1 in L2)
l_1,l_2,diff=0,_unique=0: [2, 3, 3, 4, 5]           L1 in L2
"""

Эта функция позволяет сравнивать два списка (L_1 и L_2). Параметр DIFF устанавливает сравнение для поиска общих элементов (DIFF == True) или различных элементов (DIFF == False) в обоих списках. На следующем уровне поведение метода задается параметром _UNIQUE. _UNIQUE == True будет использовать наборы Python - в этом случае метод возвращает отсортированный список уникальных элементов, удовлетворяющих DIFF. Когда _UNIQUE == False - возвращаемый список является более явным, то есть сначала он будет содержать все элементы L_1, за которыми следуют все элементы L_2, удовлетворяющие DIFF. Поскольку выходные данные будут содержать повторяющиеся вхождения элементов в L_1 и L_2, удовлетворяющих условию DIFF, пользователь может подсчитать количество раз, которое элемент отличается или является общим для списков. Поскольку это предложение представляет собой просто компиляцию кода, предложенного "cowlinator" и J.S Method2, пожалуйста, просмотрите эти публикации авторов для обсуждения скорости и производительности вычислений. Кредиты Cowlinator и J.S. Method2

Ответ 20

list1=[1,2,3,4,5]
list2=[4,5,6,3,7]
for c in list1: 
    if(c in list2): 
        print("common elements in list are:",c)
    else:
        print("non common elements in list are:",c)