列表中项目的频率

时间:2018-10-26 19:21:42

标签: python

我有一个名为bi_grams的列表列表,我想要每个二元组的频率。 bi_grams的长度为23087,所以我可能需要一个循环(?)

<body>Div with some content</body>

预期产量

bi_grams= [[('ABC', 'Memorial'), ('Memorial', 'Hospital')], [('ABC', 'Memorial'), ('Memorial', 'Clinic')]]

我已经尝试过dict_items([(('ABC', 'Memorial'), 2), (('Memorial', 'Hospital'), 1), (('Memorial', 'Clinic'),1]) 但这只会让我知道第一个列表的频率。

我也尝试过Counter(map(tuple, bi_grams[0])).items(),但这只是给我每个列表的计数,而不是列表中的二元组。

非常感谢您的帮助。

3 个答案:

答案 0 :(得分:2)

您有一个嵌套列表,可以使用itertools.chain.from_iterable进行拼合。

除了这种复杂性,问题归结为collections.Counter的简单应用,因为Counter在计算元组方面没有问题。

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

答案 1 :(得分:2)

@timgeb建议的

chain.from_iterable可能是可行的方法,但是您也可以通过列表理解来平化列表,然后应用Counter

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

答案 2 :(得分:0)

您也可以使用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)]

Counter仅计算拼合列表中的内容:

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