我对编程还很陌生,但是我要做的基本上是这样:
如果我有2个列表:
ls1 = ("red", "red", "red", "black", "black", "black")
ls2 = ("red", "red", "black", "black", " red", "red" )
我想计算ls1
中的某个特定项目等于ls2
上相同位置的项目。
但是每个项目的计数需要分开。我不希望任何匹配的“总计”,而是特定于每个字符串。假设我想知道有多少个“红色”匹配项。这将给我答案2,因为两个列表的位置[0]和[1]均为“红色”。如果我想要“黑色”,它将给我1,因为只有位置[3]都匹配为“黑色”。
我试图独自找出一个问题,并在该论坛中进行了大量搜索,但找不到针对此特定问题的答案。我什至不知道从哪里开始。 = /
答案 0 :(得分:3)
要在Python中迭代序列,请使用for-loop。
要并行地迭代两个序列,请使用zip
。
要存储结果,请使用dictionary,它将唯一键映射到值。
如果您不知道字典中是否存在键,则可以使用dict.get
提供默认值。
将所有这些片段放在一起:
>>> d = {}
>>> for s1, s2 in zip(ls1, ls2):
... if s1 == s2:
... d[s1] = d.get(s1, 0) + 1
...
>>> d
{'red': 2, 'black': 1}
答案 1 :(得分:3)
作为对wim's answer的后续操作,您还可以从仅具有相同索引元素的列表中创建Counter
:
from collections import Counter
ls1 = ("red","red","red", "black","black", "black")
ls2 = ("red", "red", "black", "black", "red", "red")
c = Counter([x for x, y in zip(ls1, ls2) if x == y])
print(c) # Counter({'red': 2, 'black': 1})
答案 2 :(得分:1)
一般方法是iterate through the lists,并在找到匹配项时增加匹配数。以下是带有注释的python解决方案
def getCounts(a, b):
# Initialize counts
counts = {}
# Go through the lists together. Assumption: lists are of same size
for i in range(len(a)):
# If elements are equal, increase count
if a[i] == b[i]:
counts[a[i]] = counts.get(a[i], 0) + 1
return counts
答案 3 :(得分:0)
如果您想计算所有出现的次数而没有特定项位于相应的索引处,那么这可能会有所帮助
res = {}
for i in set(ls2):
res[i] = ls1.count(i)
print(res)
{'black': 3, 'red': 3}
答案 4 :(得分:0)
如果您可以使用3rd party库,那么使用Pandas是一种有趣的方式:
import pandas as pd
ls1 = ("red", "red", "red", "black", "black", "black")
ls2 = ("red", "red", "black", "black", " red", "red" )
s1 = pd.Series(ls1)
s2 = pd.Series(ls2)
res = s1.loc[s1 == s2].value_counts().to_dict()
{'black': 1, 'red': 2}