Python 列表列表中项目的频率

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

我有一个叫做biu grams的列表,我想要每个bigram的频率。比克的长度是23087,所以我可能需要一个循环(?)

预期产量

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})