比较列表以查找python中的常见元素

时间:2012-12-04 19:34:59

标签: python

  

可能重复:
  Python - Intersection of two lists

我正在尝试比较两个列表,以便找到它们共有的元素数量。

我遇到的主要问题是任何一个列表包含重复的元素,例如

A = [1,1,1,1]   and  
B = [1,1,2,3]

使用代码

n = 0
for x in A:
   if x in B:
      n += 1
print n

给我输出n = 4,因为从技术上讲,A的所有元素都在B

我希望得到n = 2的输出,最好不使用套装,无论如何我可以调整我的代码,或者一种新的思考方法来实现这个目标吗?

由于

4 个答案:

答案 0 :(得分:5)

目前还不完全清楚您的规范是什么,但是如果您希望AB中的元素数量出现在>>> from collections import Counter >>> A = [1,1,1,1] >>> B = [1,1,2,3] >>> C = Counter(A) & Counter(B) >>> sum(C.itervalues()) 2 >>> list(C.elements()) [1, 1] 中,而不考虑顺序,而是考虑到多重性,请使用{{3 }}:

{{1}}

答案 1 :(得分:2)

这是一种有效的(O(n logn))方法,无需使用集合:

def count_common(a, b):
  ret = 0
  a = sorted(a)
  b = sorted(b)
  i = j = 0
  while i < len(a) and j < len(b):
    c = cmp(a[i], b[j])
    if c == 0:
      ret += 1
    if c <= 0:
      i += 1
    if c >= 0:
      j += 1
  return ret

print count_common([1,1,1,1], [1,1,2,3])

如果您的列表始终按照示例中的顺序排序,则可以删除两个sorted()来电。这将提供O(n)算法。

答案 2 :(得分:1)

这是一种完全不同的思考问题的方式。

想象一下,我有两个单词"hello""world"。为了找到共同的元素,我可以遍历"hello",给我['h', 'e', 'l', 'l', 'o']。对于列表中的每个元素,我将从第二个list(word)中删除它。

  1. 'h'中有['w', 'o', 'r', 'l', 'd']吗?没有。
  2. 'e'中有['w', 'o', 'r', 'l', 'd']吗?否。
  3. 'l'中有['w', 'o', 'r', 'l', 'd']吗?是!
  4. "world"删除它,给我['w', 'o', 'r', 'd']
  5. {li>在'l'中是['w', 'o', 'r', 'd']?否。
  6. 'o'中有['w', 'o', 'r', 'd']吗?
  7. 是!删除它['w', 'o', 'r', 'd'],给我['w', 'r', 'd']
  8. 比较原始对象的长度(确保你保留了副本)到新生成的对象,你会看到2的差异,表示2个常见字母。

答案 3 :(得分:0)

所以你希望程序检查两个列表中相同索引的元素是否相等?这将是非常简单的:只是迭代两个数组的长度(我认为,应该是相同的长度),比如说使用变量i,并用A.index(i)和B进行比较。 index(i)函数。 如果您愿意,我可以发布代码。

如果这不是您想要做的,请确保您的问题更清晰。