假设我有两个列表,如下所示:
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)
你可以使用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工作的必要条件,因为它的元素存储为字典
您可以将两个列表压缩在一起,然后使用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)