2012-12-04 542 views
3

可能重复:
Python - Intersection of two lists比较列表,以找到共同的元素在Python

我想要两个列表,以便找到他们所共有的元素的数量进行比较。

我遇到的主要问题是,当任一列表包含了使用代码

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

给我的输出重复的元素,例如

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

n = 4,在技术上的所有元素A在B

我想获得输出n = 2,最好不使用sets,有没有反正我可以适应我的c颂赞,还是一种思考问题的新方式来实现这一目标?

感谢

+3

有什么特别的原因,以避免使用套?他们似乎提供了完美的解决方案:'LEN(组(A)组(B))' – Blckknght

+0

并不特别,它只是它的一个从修改单,我们的问题,并没有实际使用的套尚未 – user1876831

+1

你确定你想让你的答案为2,而不是1?这两个列表中只有一个值(数字1)。如果这些集合是[1,2,3,3]和[1,1,2,3]'你想要数字是什么? – Blckknght

回答

0

所以,你想要的程序来检查在两个列表相同指数仅元素是否相等?这很简单:只要迭代两个数组的长度(我认为它应该具有相同的长度),比如说使用变量i,然后用A.index(i)和B.指数(i)功能。 如果你愿意,我可以发布代码。

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

+0

而不是循环上的索引,我会使用'zip'结合清单,如果这是所期望的。 – Blckknght

1

下面是对这个问题的完全不同的思考方式。

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

  1. 'h' in ['w', 'o', 'r', 'l', 'd']
  2. 'e' in ['w', 'o', 'r', 'l', 'd']
  3. 'l' in ['w', 'o', 'r', 'l', 'd']?是!
  4. "world"中删除它,给我['w', 'o', 'r', 'd']
  5. 'l' in ['w', 'o', 'r', 'd']
  6. 'o' in ['w', 'o', 'r', 'd']
  7. 是的!删除它['w', 'o', 'r', 'd'],给我['w', 'r', 'd']

比较原始对象的长度(确保你已经把周围的复印件)到新生成的对象,你会看到2的差异,说明2个常用字母。

+0

这是解决它的一个很不错的,完全不同的方式,我想我会试着在我的代码使用。非常感谢! – user1876831

5

这不是完全清楚你的规范是什么,但如果你想在A元素的数量出现在B,无需考虑顺序,但与多样性方面,使用collections.Counter

>>> 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] 
+0

为什么downvotes? –

+0

是的,这是我为后,谢谢 – user1876831

+0

这可能是最高性能的解决方案。它是O(N)我认为(其中N是'len(A)+ len(B)')。 – Blckknght

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)算法。

+0

我在排序的数组上测试了这个,没有'sorted()'调用,完全键入并用Cython编译,而且更简单的'sorted(set(a)&set(b))',即使使用> 1e10随机元素。另外后者不需要对最初的列表进行排序。 – JulienD