我有2个列表:a = ['5', '2', '3', '4']
和b = ['1', '6', '7', '5']
。使用Python 2,如何将a
中的每个列表元素与b
中的每个元素进行比较? (即a[0] == b[0]
,a[0] == b[1]
等等。
我知道我可以写出许多if
语句,但我希望有更优雅的方法来做到这一点。
检查每个列表元素后,我想知道找到共享值的次数(在上面的示例列表中,它将是一次,'5'
)。
编辑:这不是重复,b / c我将两个不同的列表相互比较,而可能的重复只处理了一个列表。
答案 0 :(得分:5)
list
的{{3}}方法可能有所帮助:
>>> a = ['5', '2', '3', '4']
>>> b = ['1', '6', '7', '5']
>>> for item in a:
... print item, b.count(item)
...
5 1
2 0
3 0
4 0
答案 1 :(得分:2)
大输入可能比eugene y's更快,因为它只需要迭代b
一次,
而不是len(a)
次:
from collections import Counter
counts = Counter(b)
for i in a:
print(i, counts[i])
答案 2 :(得分:1)
如果您只关注共享值,而不关注其位置或计数,请将其转换为set
并使用intersection
:
>>> a = ['5','2','3','4']
>>> b = ['1','6','7','5']
>>> set(a).intersection(b)
{'5'}
如果您想保留元素在交叉点中出现的频率,您还可以使用&
collections.Counter
的交集
>>> a = ['5','2','3','4','1','1','6','5']
>>> b = ['1','6','7','5','5']
>>> collections.Counter(a) & collections.Counter(b)
Counter({'5': 2, '1': 1, '6': 1})
注意:这与@GingerPlusPlus的解决方案的不同之处在于它是对称的,即如果列表5
中存在a
一次,列表b
中存在两次,那么共享计数将为1
,而不是2
。
答案 3 :(得分:0)
def cmp(*lists):
lists_len_min = list(map(lambda x: len(x), lists))
if min(lists_len_min) != max(lists_len_min):
raise Exception("Lists must have equal length")
iterator = iter(lists)
last = next(iterator)
for element in iterator:
for i, each in enumerate(element):
#print(i, last[i], each)
if last[i] != each:
return False
else:
return True
此功能可以比较所需数量相同的列表。只需调用cmp(list1,list2,list3)
答案 4 :(得分:0)
此代码将生成包含a
和b
列表
a = [1,2,3,4]
b = [2,3,1,7]
c = [e for e in a if e in b]
如果您使用大型数组,但是如果您打算使用此数据,那么内存可能会很复杂