Форум сайта python.su
Здраствуйте товарищи!
Подскажите пожалуйста есть ли элегантное решение, задача такая:
есть список вида
a = {“aaa”: “a”, “bbb”: “b”, “ccc”: “c”}
и есть срока типа
str = “qqwwweirweru-aaa-qwoeiopqwepw”
можно ли как то сравнить с помощью re.match(<элемент из списка (напр. “aaa”)>, str) сразу весь список? или может есть другой метод? или надо тупо перебирать кадый раз список построчно и сравнивать строку?
в итоге если в str найдено совпадеине с одним из элементов списка например “ааа”, то возвращаем “а”
Офлайн
А чем перебор не устраивает? Можно вот так извратиться:
a = {"aaa": "a", "bbb": "b", "ccc": "c"}
s = "qqwwweirweru-aaa-qwoeiopqwepw"
matches = map(lambda x: re.match('.*%s.*'%x,s),sorted(a.keys()))
map(lambda x,y: a[y] if x is not None else None, matches, sorted(a.keys()))
Офлайн
Можно из списка сделать рег. выражение вида “aaa|bbb|ccc”
a = {"aaa": "a", "bbb": "b", "ccc": "c"}
s = "qqwwweirweru-aaa-qwoeiopqwepw"
r = re.search( "|".join( a.keys() ), s )
if r is None:
print "NotFound"
else:
print a[ r.group(0) ]
Офлайн
Vaderспасибо!
А чем перебор не устраивает? Можно вот так извратиться:a = {"aaa": "a", "bbb": "b", "ccc": "c"}
s = "qqwwweirweru-aaa-qwoeiopqwepw"
matches = map(lambda x: re.match('.*%s.*'%x,s),sorted(a.keys()))
map(lambda x,y: a[y] if x is not None else None, matches, sorted(a.keys()))
Офлайн
Вы бы проверили сначала, что быстрее. У меня, например, на вашем примере перебор работает в 2 раза быстрее, чем тот код, который я написал выше.
Отредактировано (Апрель 27, 2011 14:47:25)
Офлайн
ок, попробую, спс за помощь, ваш вариант для меня еще темный лес, я только учусь.
Офлайн