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

Compare lists to find common elements in python

本问题已经有最佳答案,请猛点这里访问。

Possible Duplicate:
Python - Intersection of two lists

我试图比较两个列表,以找出它们有共同点的元素的数量。

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

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

使用代码

1
2
3
4
5
n = 0
for x in A:
   if x in B:
      n += 1
print n

给出了n = 4的输出,从技术上讲,a的所有元素都在b中。

我想得到n = 2的输出,最好不使用sets,我是否可以修改我的代码,或者用一种新的方法来思考问题来实现这一点?

谢谢


不完全清楚您的规范是什么,但是如果您希望B中出现的A中的元素数量,而不考虑顺序,而是考虑到多样性,请使用collections.Counter

1
2
3
4
5
6
7
8
>>> 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]


以下是一种不使用集合的高效(O(n logn)方法:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
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)算法。


对于这个问题,有一种完全不同的思考方式。

假设我有两个词,"hello""world"。为了找到公共元素,我可以迭代"hello",给出['h', 'e', 'l', 'l', 'o']。对于列表中的每个元素,我将从第二个list(word)中删除它。

  • 'h'['w', 'o', 'r', 'l', 'd']中吗?不。
  • 'e'['w', 'o', 'r', 'l', 'd']中吗?不。
  • 'l'['w', 'o', 'r', 'l', 'd']中吗?对!
  • "world"上取下,给我['w', 'o', 'r', 'd']
  • 'l'['w', 'o', 'r', 'd']中吗?不。
  • 'o'['w', 'o', 'r', 'd']中吗?
  • 对!把它取下来,给我一个。
  • 将原始对象的长度(确保保存了一份副本)与新生成的对象进行比较,您将看到2个不同的值,表示2个常用字母。


    所以您希望程序检查两个列表中相同索引的元素是否相同?这将非常简单:只需迭代两个数组的长度(我假设两个数组的长度应该相同),比如使用变量i,然后通过a.index(i)和b.index(i)函数对每个数组进行比较。如果你愿意,我可以把密码贴出来。

    如果这不是你想做的,请把你的问题弄清楚。