Ответ 1
>>> list1 = [1,2,3,4,5,6]
>>> list2 = [3, 5, 7, 9]
>>> list(set(list1).intersection(list2))
[3, 5]
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)
До сих пор, но не могу заставить его работать!
Есть идеи?
>>> list1 = [1,2,3,4,5,6]
>>> list2 = [3, 5, 7, 9]
>>> list(set(list1).intersection(list2))
[3, 5]
Вы также можете использовать наборы и получить общие черты в одной строке: вычесть набор, содержащий отличия от одного из наборов.
A = [1,2,3,4]
B = [2,4,7,8]
commonalities = set(A) - (set(A) - set(B))
Решения, предлагаемые 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 внутри.
используйте множество пересечений, установите (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']
>>>
>>>
Обратите внимание, что список результатов может отличаться от исходного списка.
Вы можете использовать простое понимание списка:
x=[1,2,3,4]
y=[3,4,5]
common = [i for i in x if i in y]
common: [3,4]
В предыдущих ответах все работают, чтобы найти уникальные общие элементы, но не будут учитывать повторяющиеся элементы в списках. Если вы хотите, чтобы общие элементы отображались в том же количестве, что и в общих списках, вы можете использовать следующий однострочный шрифт:
l2, common = l2[:], [ e for e in l1 if e in l2 and (l2.pop(l2.index(e)) or True)]
Часть or True
необходима, только если вы ожидаете, что какие-либо элементы будут оцениваться с помощью False
.
это мое предложение, я думаю, что с наборами проще, чем с циклом for
def unique_common_items(list1, list2):
# Produce the set of *unique* common items in two lists.
return list(set(list1) & set(list2))
Сет - это еще один способ решить эту проблему.
a = [3,2,4]
b = [2,3,5]
set(a)&set(b)
{2, 3}
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)
Используйте генератор:
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)
Вот довольно грубый метод, с которым я столкнулся. Это, конечно, не самое эффективное, но это что-то.
Проблема, которую я нашел с некоторыми из решений здесь, состоит в том, что либо она не дает повторяющихся элементов, либо не дает правильного количества элементов, когда имеет значение порядок ввода.
#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
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)
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)
Привет, это мое предложение (очень просто)
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
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")
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))
Ваша проблема в том, что вы возвращаетесь из цикла for, поэтому вы получите только первое совпадение. Решение состоит в том, чтобы переместить ваше возвращение за пределы цикла.
def elementosEnComunEntre(lista1,lista2):
elementosEnComun = set()
for e1 in lista1:
if(e1 in lista2):
elementosEnComun.add(e1)
return list(elementosEnComun)
import numpy as np
np.intersect1d([1, 3, 4, 3], [3, 1, 2, 1])
array([1, 3])
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
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)