Регулярное выражение в 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.