Регулярное выражение в Python Counter

У меня есть этот пример кода для счетчика Python.

from collections import Counter

lst = ['item', 'itemm', 'iitem', 'foo', 'bar'] 
c = Counter(lst) 
Counter({'bar': 1, 'foo': 1, 'iitem': 1, 'item': 1, 'itemm': 1})

Если я сделаю c['item'] я получил 1, но я хочу получить 3 из-за опечаток в списке.

Я попробовал следующее, это не дает мне 3 но я все еще работаю с этим:

import re

for word in lst:
    if re.search('item',word):
        print(word,c[word])

item 1
itemm 1
iitem 1

Есть ли более эффективный способ сделать это без перебора списка?

1 ответ

Решение

Вы можете использовать list_comprehension вместе с sum

>>> d = {'bar': 1, 'foo': 1, 'iitem': 1, 'item': 1, 'itemm': 1}
>>> sum([d[i] for i in d.keys() if re.search(r'item', i)])
3

или же

Без регулярных выражений,

>>> sum([d[i] for i in d.keys() if 'item' in  i])
3

Позвольте мне дать еще несколько деталей для решения приближенного соответствия строк (это основная проблема здесь).

Ортогональные ошибки могут быть сопоставлены с помощью проверки расстояния редактирования (или так называемой метрики расстояния Левенштейна). Это можно рассчитать с помощью python-Levenshtein пакет:

from Levenshtein import distance
edit_dist = distance("ah", "aho")

Пример взят из вопроса о SO со ссылкой на этот конкретный модуль.

Еще одна ссылка для нечеткого сопоставления строк в Python.

Другие вопросы по тегам