Подсчет количества предметов в нескольких группах - PullRequest
0 голосов
/ 10 сентября 2018

Мой код выглядит следующим образом, где words - это список:

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

... и так далее. У меня есть около 30 различных категорий, которые я пытаюсь распределить в words.

Как мне написать это более кратко?

1 Ответ

0 голосов
/ 10 сентября 2018

Я предлагаю вам разделить логику на 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)))
...