Я предлагаю вам разделить логику на 2 шага. Во-первых, реверс сопоставления вашей категории для сопоставления животных с категорией. Например:
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)))