Python 列表列表中项目的频率
我有一个叫做biu grams的列表,我想要每个bigram的频率。比克的长度是23087,所以我可能需要一个循环(?) 预期产量Python 列表列表中项目的频率,python,Python,我有一个叫做biu grams的列表,我想要每个bigram的频率。比克的长度是23087,所以我可能需要一个循环(?) 预期产量 dict_items([(('ABC', 'Memorial'), 2), (('Memorial', 'Hospital'), 1), (('Memorial', 'Clinic'),1]) 我尝试了计数器(映射(元组,双元组[0])。items() 但它只给出了第一个列表中的双字符频率 我也尝试了计数器(map(tuple,bi_gram[0:2])。ite
dict_items([(('ABC', 'Memorial'), 2),
(('Memorial', 'Hospital'), 1), (('Memorial', 'Clinic'),1])
我尝试了计数器(映射(元组,双元组[0])。items()
但它只给出了第一个列表中的双字符频率
我也尝试了计数器(map(tuple,bi_gram[0:2])。items()
但它只给出每个列表的计数,而不是列表中的bigram
非常感谢你的帮助 您有一个嵌套列表,可以用它展平 除此之外,问题归结为的一个简单应用,因为
计数器
在计算元组方面没有问题
>>> from collections import Counter
>>> from itertools import chain
>>>
>>> bi_grams= [[('ABC', 'Memorial'), ('Memorial', 'Hospital')], [('ABC', 'Memorial'), ('Memorial', 'Clinic')]]
>>> Counter(chain.from_iterable(bi_grams))
>>>
Counter({('ABC', 'Memorial'): 2,
('Memorial', 'Clinic'): 1,
('Memorial', 'Hospital'): 1})
还有一个非常直截了当的解决方案,它是for
循环:
>>> c = Counter()
>>> for x in bi_grams:
...: c.update(x)
...:
>>> c
>>>
Counter({('ABC', 'Memorial'): 2,
('Memorial', 'Clinic'): 1,
('Memorial', 'Hospital'): 1})
chain.@timgeb建议的from_iterable
可能是一种方法,但您也可以通过列表理解将列表展平,然后应用计数器
:
from collections import Counter
bi_grams= [[('ABC', 'Memorial'), ('Memorial', 'Hospital')], [('ABC', 'Memorial'), ('Memorial', 'Clinic')]]
>>> Counter(i for x in bi_grams for i in x)
Counter({('ABC', 'Memorial'): 2, ('Memorial', 'Hospital'): 1, ('Memorial', 'Clinic'): 1})
您也可以使用
chain(*iterable)
习惯用法:
>>> from itertools import chain >>> from collections import Counter
>>> Counter(chain(*bi_grams))
Counter({('ABC', 'Memorial'): 2, ('Memorial', 'Hospital'): 1, ('Memorial', 'Clinic'): 1})
使用
chain(*iterable)
,将元组列表展平到内部列表,例如:
>>> x = [[(1,2), (3,4)], [(5,6)], [(7,8)]]
>>> list(chain(*x))
[(1, 2), (3, 4), (5, 6), (7, 8)]
计数器
只计算展平列表中的内容:
>>> x = [[(1,2), (3,4)], [(5,6)], [(7,8)]]
>>> Counter(chain(*x))
Counter({(1, 2): 1, (3, 4): 1, (5, 6): 1, (7, 8): 1})
>>> x = [[(1,2), (3,4)], [(5,6)], [(7,8)]]
>>> Counter(chain(*x))
Counter({(1, 2): 1, (3, 4): 1, (5, 6): 1, (7, 8): 1})