计算2个列表之间的匹配项(考虑顺序)

时间:2018-11-09 19:33:54

标签: python

我对编程还很陌生,但是我要做的基本上是这样:
如果我有2个列表:

ls1 = ("red", "red",  "red",  "black", "black", "black")
ls2 = ("red", "red", "black", "black", " red",   "red" )

我想计算ls1中的某个特定项目等于ls2上相同位置的项目。

但是每个项目的计数需要分开。我不希望任何匹配的“总计”,而是特定于每个字符串。假设我想知道有多少个“红色”匹配项。这将给我答案2,因为两个列表的位置[0]和[1]均为“红色”。如果我想要“黑色”,它将给我1,因为只有位置[3]都匹配为“黑色”。

我试图独自找出一个问题,并在该论坛中进行了大量搜索,但找不到针对此特定问题的答案。我什至不知道从哪里开始。 = /

5 个答案:

答案 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}