如何根据另一个列表,在一个列表中计算某个项出现的次数

4
假设我有以下两个列表:
list1 = ["a","b","a","a","b","a","b","a","b","b","b"]
list2 = ["pos","neg","pos","neu","neg","pos","pos","pos","neg","neu","pos"]

我想统计在list1中的每个项目中出现"pos""neg""neu"的次数。
因此,"a""b""pos","neg""neu"出现的次数是需要计算的。例如,list1的第一个元素"a""pos"值是由于list2[0]"pos"形成的。
最佳方法是什么?我觉得与我目前所做的相比,还有更好的解决方案。如果list1中存在更多唯一的项目,我的方法将不可行。
list1 = ["a","b","a","a","b","a","b","a","b","b","b"]
list2 = ["pos","neg","pos","neu","neg","pos","pos","pos","neg","neu","pos"]

a_pos = 0
a_neg = 0
a_neu = 0
b_pos = 0
b_neg = 0
b_neu = 0

for i in range(len(list1)):
    if list1[i] == "a":
        if list2[i] == "pos":
            a_pos +=1
        elif list2[i] == "neg":
            a_neg +=1
        else:
            a_neu +=1
    if list1[i] == "b":
        if list2[i] == "pos":
            b_pos +=1
        elif list2[i] == "neg":
            b_neg +=1
        else:
            b_neu +=1       

print(a_pos,a_neg,a_neu)
print(b_pos,b_neg,b_neu)
2个回答

8

您可以使用 Counterzip

from collections import Counter
Counter(zip(list1, list2))

Counter({('a', 'pos'): 4,
         ('b', 'neg'): 3,
         ('a', 'neu'): 1,
         ('b', 'pos'): 2,
         ('b', 'neu'): 1})

当使用zip时,它会创建一个可迭代对象,其中包含两个列表中的元素交替出现:

[('a', 'pos'), ('b', 'neg'), ('a', 'pos'),...

所以上面的代码之所以可以工作,是因为 zip 返回的是元组,它们是可哈希的。这是 Counter 能够正常工作的必要条件,因为它的元素存储在字典中。

6
您可以将两个列表压缩在一起,然后使用collections.Counter来计算共同出现的次数。
from collections import Counter
list1 = ["a","b","a","a","b","a","b","a","b","b","b"]
list2 = ["pos","neg","pos","neu","neg","pos","pos","pos","neg","neu","pos"]

print(Counter(zip(list1, list2)))

输出结果将为:
{('a', 'pos'): 4, ('b', 'neg'): 3, ('a', 'neu'): 1, ('b', 'pos'): 2, ('b', 'neu'): 1}

简而言之,zip 接收两个列表,创建一个迭代器,其中每个元素交错来自两个列表的各自元素。

In [1]: from collections import Counter 
   ...: list1 = ["a","b","a","a","b","a","b","a","b","b","b"] 
   ...: list2 = ["pos","neg","pos","neu","neg","pos","pos","pos","neg","neu","pos"]                                                                                                                     

In [2]: list(zip(list1,list2))                                                                                                                                                                          
Out[2]: 
[('a', 'pos'),
 ('b', 'neg'),
 ('a', 'pos'),
 ('a', 'neu'),
 ('b', 'neg'),
 ('a', 'pos'),
 ('b', 'pos'),
 ('a', 'pos'),
 ('b', 'neg'),
 ('b', 'neu'),
 ('b', 'pos')]

我们接着将这个输出放入一个Counter中,它会计算迭代器中每个项目的频率,并给我们提供一个字典。这是可能的,因为字典的键是一个可哈希的类型tuple
In [3]: Counter(list(zip(list1,list2)))                                                                                                                                                                 
Out[3]: 
Counter({('a', 'pos'): 4,
         ('b', 'neg'): 3,
         ('a', 'neu'): 1,
         ('b', 'pos'): 2,
         ('b', 'neu'): 1})

很好。请问您能否添加一些详细信息吗? - Swadhikar
1
嗨@SwadhikarC,我已经添加了代码如何工作的详细信息。请看一下并检查是否有意义 :) - Devesh Kumar Singh

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接