我有两个列表(大小相同)
a = [0, 0, 1, 0, 0, 1, 1, 0]
b = [2, 2, 0, 2, 1, 1, 0, 2]
假设当值“0”在列表“a”中匹配时,我需要获取值“2”在列表“b”中出现的次数。例如在前两个列表中,我希望得到 4(我在位置 0、1、3、7 的位置同时在 'a' 中有值 '0' 和在 'b' 中有值 '2')
一种方法:
len([x for x,y in zip(a,b) if x==0 and y==2])
但我想知道是否有更好的解决方案
最佳答案
如果您的数组(也许您指的是列表)会更长,请使用 itertools.izip
会更好,因为 zip
将从 a
和 b
>>> a = [0, 0, 1, 0, 0, 1, 1, 0]
>>> b = [2, 2, 0, 2, 1, 1, 0, 2]
>>> from itertools import izip
>>> sum(x == 0 and y == 2 for x, y in izip(a, b))
4
此处,x == 0 和 y == 2
是一个 bool 表达式,因此结果将是 True
或 False
。在 Python 中,True
为 1
,False
为 0
。
>>> False == 0
True
>>> True == 1
True
和sum
函数对所有这些求和并给出结果。
另外,请注意我们没有将列表传递给 sum
([
和 ]
不存在)。这意味着我们正在传递一个生成器表达式。 sum
将调用生成器表达式来获取值。因此,不会创建临时列表,就像在您的 len
解决方案中一样,但会按需检索值。阅读有关生成器和生成器表达式的更多信息,here
因此,如果您的列表很长(因为它避免了任何临时列表构造),此解决方案将非常节省空间并且非常有用。
关于python - 获取两个不同列表中同一索引处的一对值的出现次数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30100069/