2010-05-19 172 views
45
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) 

到目前为止,但似乎无法使其工作!由于2个列表之间的通用元素比较

回答

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

+1而我个人倒用frozenset,因为它是不可变的,因此可以作为字典的键等 – zebrabox 2010-05-19 11:04:53

+6

这将返回/独特/共同的元素,但不是可能存在的任何重复的元素。 – Dologan 2014-03-20 18:52:18

+0

@SilentGhost。如何从两个列表中获取匹配元素的数量。在这种情况下,它是2。 – Poka 2017-12-09 11:53:38

17

使用一套交叉口,设置(列表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'] 
>>> 
>>> 

注意,结果列表可能是不同的顺序与原来的名单。

+0

感谢您的帮助。了解我出错的地方以及下次要做什么。 :) – Daniel 2010-05-19 12:29:48

+0

这太棒了,丹尼尔:-) – YOU 2010-05-19 12:47:13

+1

伟大的解决方案。还有一种方法可以通过这个来保存订单吗? – tarrasch 2012-08-30 15:47:04

22

S.MarkSilentGhost建议的解决方案通常会告诉您应该如何以Pythonic方式完成,但我认为您也可以从知道您的解决方案不起作用的原因中受益。问题是,只要你找到两个列表中的第一个公共元素,就只返回那个单一元素。

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

更短的版本使用列表理解:您的解决方案可以通过创建一个result列表,该列表中收集的共同要素是固定

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

然而,正如我所说,这是一个这样做非常低效 - Python的内置集合类型在内部用C实现时效率更高。

+0

对两个提议都很好 – dlewin 2015-09-21 12:41:20

+0

注意:上述方法只适用于相同大小的列表。如果您正在处理大小不一的列表,那么您需要在调用函数之前根据len()评估订单: list1 = [2,2,2],list2 [2,3] - > [2,2,2] list1 = [2,3],list2 [2,2,2] - > [2] – redthumb 2016-09-30 11:56:41

8

以前的答案都可以找到唯一的共同元素,但是无法解释列表中的重复项。如果你想共同要素出现在相同数量,因为它们是在共同发现的列表,可以使用下面的一行代码:

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

,如果你希望的任何元素的or True部分只需要评估为False

+0

真棒解决方案,似乎是最彻底的,如果有点简洁 – Hendeca 2017-03-08 21:25:58

+0

这应该是答案应该已经被选中了!我假设它也适用于不平等的名单。此外,大多数解决方案使用不稳定的“集合”(又称订单丢失)。 – lifebalance 2017-06-15 14:14:41

1

1)方法1 节省list1的是字典,然后迭代在list2中每个ELEM

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)

0

这里的我想出了一个相当暴力的方法。这当然不是最有效的,但它是一些东西。

我在这里找到的一些解决方案存在的问题是,它不会给出重复的元素,或者当输入顺序很重要时它不会给出正确数量的元素。

#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 
16

您也可以使用集合并在一行中获得共同性:从包含集合中的差异的集合中减去集合。

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