我正在尝试比较两个列表,以便找到它们共有的元素数量。
我遇到的主要问题是任何一个列表包含重复的元素,例如
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
的输出,最好不使用套装,无论如何我可以调整我的代码,或者一种新的思考方法来实现这个目标吗?
由于
答案 0 :(得分:5)
目前还不完全清楚您的规范是什么,但是如果您希望A
中B
中的元素数量出现在>>> 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)
中删除它。
'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']
吗? ['w', 'o', 'r', 'd']
,给我['w', 'r', 'd']
比较原始对象的长度(确保你保留了副本)到新生成的对象,你会看到2的差异,表示2个常见字母。
答案 3 :(得分:0)
所以你希望程序检查两个列表中相同索引的元素是否相等?这将是非常简单的:只是迭代两个数组的长度(我认为,应该是相同的长度),比如说使用变量i,并用A.index(i)和B进行比较。 index(i)函数。 如果您愿意,我可以发布代码。
如果这不是您想要做的,请确保您的问题更清晰。