我的代码如下所示,其中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个不同的类别中。
我怎么能更简洁地写这个?
答案 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)))