首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >项目在列表列表中的频率

项目在列表列表中的频率
EN

Stack Overflow用户
提问于 2018-10-27 03:21:42
回答 3查看 584关注 0票数 3

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

代码语言:javascript
运行
复制
bi_grams= [[('ABC', 'Memorial'), ('Memorial', 'Hospital')], [('ABC', 'Memorial'), ('Memorial', 'Clinic')]]

预期输出

代码语言:javascript
运行
复制
dict_items([(('ABC', 'Memorial'), 2), 
(('Memorial', 'Hospital'), 1), (('Memorial', 'Clinic'),1])

我尝试过Counter(map(tuple, bi_grams[0])).items(),但它只给出了第一个列表中的二元语法频率。

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

会非常感谢你的帮助。

EN

回答 3

Stack Overflow用户

发布于 2018-10-27 03:25:46

您有一个嵌套的列表,您可以使用itertools.chain.from_iterable将其展平。

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

代码语言:javascript
运行
复制
>>> 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循环:

代码语言:javascript
运行
复制
>>> c = Counter()
>>> for x in bi_grams:
...:    c.update(x)
...:    
>>> c
>>> 
Counter({('ABC', 'Memorial'): 2,
         ('Memorial', 'Clinic'): 1,
         ('Memorial', 'Hospital'): 1})
票数 3
EN

Stack Overflow用户

发布于 2018-10-27 03:28:42

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

代码语言:javascript
运行
复制
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
EN

Stack Overflow用户

发布于 2018-10-28 23:01:53

你也可以使用chain(*iterable)的习惯用法:

代码语言:javascript
运行
复制
>>> from itertools import chain                                                    >>> from collections import Counter
>>> Counter(chain(*bi_grams))
Counter({('ABC', 'Memorial'): 2, ('Memorial', 'Hospital'): 1, ('Memorial', 'Clinic'): 1})

使用chain(*iterable)将元组列表展平为内部列表,例如

代码语言:javascript
运行
复制
>>> x = [[(1,2), (3,4)], [(5,6)], [(7,8)]]

>>> list(chain(*x))
[(1, 2), (3, 4), (5, 6), (7, 8)]

Counter简单地计算扁平化列表中的内容:

代码语言:javascript
运行
复制
>>> 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})
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53015104

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档