计算多个组中的项目数

时间:2018-09-10 11:39:38

标签: python counter

我的代码如下所示,其中words是列表:

for a in words:
    if a in animals:
        ani += 1
    elif a in nature:
        nat += 1
    elif a in objects:
        obj += 1

...等等。我尝试将words安排在大约30个不同的类别中。

我怎么能更简洁地写这个?

1 个答案:

答案 0 :(得分:3)

我建议您将逻辑分为两个步骤。首先,反转您的类别映射,以将动物映射到类别。例如:

animals = {'elephant', 'cobra', 'tiger', 'cow', 'mouse', 'fish', 'turtle'}
objects = {'door', 'house', 'desk'}

d_cats = {'animals': animals, 'objects': objects}
d_cats_rev = {w: k for k, v in d_cats.items() for w in v}

您可能会发现上面的内容冗长而痛苦。但是,实际上,您永远不必制作30个相关变量。您应该将它们存储在字典中,以简化操作,提高可读性和性能。

第二,使用collections.Counter,利用您刚刚创建的映射:

from collections import Counter

res = Counter(map(d_cats_rev.get, words))

同样,此方法的优点在于您不是在创建新变量,而是将结果保存在易于访问和可移动的字典中。

如果发现尚未映射所有单词,而只想包含已映射的单词,则可以使用filter删除它们:

res = Counter(filter(None, map(d_cats_rev.get, words)))