如何计算一个项目在另一个列表的基础上出现在一个列表中的次数

Mar*_*ark 4 python algorithm

假设我有两个列表,如下所示:

list1 = ["a","b","a","a","b","a","b","a","b","b","b"]
list2 = ["pos","neg","pos","neu","neg","pos","pos","pos","neg","neu","pos"]
Run Code Online (Sandbox Code Playgroud)

我要计算的次数"pos","neg"并且"neu"发生在中的每个项目上list1。

所以,次数"pos","neg"和"neu"使用时"a",和"b"。例如,在所述第一元件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"]
Run Code Online (Sandbox Code Playgroud)

yat*_*atu 8

你可以使用Counter同zip:

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

Counter({('a', 'pos'): 4,
         ('b', 'neg'): 3,
         ('a', 'neu'): 1,
         ('b', 'pos'): 2,
         ('b', 'neu'): 1})
Run Code Online (Sandbox Code Playgroud)

zip将两个列表中的元素交织在一起的地方创建一个可迭代的对象:

[('a', 'pos'), ('b', 'neg'), ('a', 'pos'),...
Run Code Online (Sandbox Code Playgroud)

所以上面的工作是因为zip返回的元组是可哈希的,这是Counter工作的必要条件,因为它的元素存储为字典


Dev*_*ngh 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)))
Run Code Online (Sandbox Code Playgroud)

输出将是

{('a', 'pos'): 4, ('b', 'neg'): 3, ('a', 'neu'): 1, ('b', 'pos'): 2, ('b', 'neu'): 1}
Run Code Online (Sandbox Code Playgroud)

要分解它,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')]
Run Code Online (Sandbox Code Playgroud)

然后,我们将输出结果放入Counter,以计算迭代器中每个项目的频率并为我们提供字典,这是可能的,因为字典的键是a 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})
Run Code Online (Sandbox Code Playgroud)