Bazzilio
Апрель 27, 2011 13:13:20
Здраствуйте товарищи!
Подскажите пожалуйста есть ли элегантное решение, задача такая:
есть список вида
a = {“aaa”: “a”, “bbb”: “b”, “ccc”: “c”}
и есть срока типа
str = “qqwwweirweru-aaa-qwoeiopqwepw”
можно ли как то сравнить с помощью re.match(<элемент из списка (напр. “aaa”)>, str) сразу весь список? или может есть другой метод? или надо тупо перебирать кадый раз список построчно и сравнивать строку?
в итоге если в str найдено совпадеине с одним из элементов списка например “ааа”, то возвращаем “а”
Vader
Апрель 27, 2011 14:00:50
А чем перебор не устраивает? Можно вот так извратиться:
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()))
agalen
Апрель 27, 2011 14:14:37
Можно из списка сделать рег. выражение вида “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) ]
Bazzilio
Апрель 27, 2011 14:15:52
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()))
спасибо!
перебор тоже работает, просто мне кажется это наверно самый медленный и неэффективный способ, поэтому подумал может есть какой то еще способ, тем более у питона вроде полно всяких функций для работы со списками.
Vader
Апрель 27, 2011 14:47:02
Вы бы проверили сначала, что быстрее. У меня, например, на вашем примере перебор работает в 2 раза быстрее, чем тот код, который я написал выше.
Bazzilio
Апрель 27, 2011 14:56:34
ок, попробую, спс за помощь, ваш вариант для меня еще темный лес, я только учусь.