Можете ли вы написать str.replace(), используя значения словаря в Python?

Мне нужно заменить север, юг и т.д. N S в полях адреса.

Если у меня

list = {'NORTH':'N','SOUTH':'S','EAST':'E','WEST':'W'}
address = "123 north anywhere street"

Могу ли я перебирать значения словаря для замены моего поля адреса?

for dir in list[]:
 address.upper().replace(key,value)

Я знаю, что я даже не закрыл! Но любой вход был бы оценен, если вы можете использовать значения словаря, подобные этому.

7 ответов

address = "123 north anywhere street"
for word, initial in {"NORTH":"N", "SOUTH":"S" }.items():
 address = address.replace(word.lower(), initial)
print address

приятный и лаконичный и читаемый.


вы близки, на самом деле:

dictionary = {"NORTH":"N", "SOUTH":"S" } 
for key in dictionary.iterkeys():
 address.upper().replace(key, dictionary[key])


"Перевод" строки со словарем является очень распространенным требованием. Я предлагаю функцию, которую вы можете захотеть сохранить в своем наборе инструментов:

def translate(text, conversion_dict, before=None):
 """
 Translate words from a text using a conversion dictionary
 Arguments:
 text: the text to be translated
 conversion_dict: the conversion dictionary
 before: a function to transform the input
 (by default it will to a lowercase)
 """
 # if empty:
 if not text: return text
 # preliminary transformation:
 before = before or str.lower
 t = before(text)
 for key, value in conversion_dict.items():
 t = t.replace(key, value)
 return t

Затем вы можете написать:

>>> a = {'hello':'bonjour', 'world':'tout-le-monde'}
>>> translate('hello world', a)
'bonjour tout-le-monde'


Один из вариантов, о которых я пока не думаю, заключается в том, чтобы создать регулярное выражение, содержащее все ключи, а затем просто выполнить замену в строке:

>>> import re
>>> l = {'NORTH':'N','SOUTH':'S','EAST':'E','WEST':'W'}
>>> pattern = '|'.join(sorted(re.escape(k) for k in l))
>>> address = "123 north anywhere street"
>>> re.sub(pattern, lambda m: l.get(m.group(0).upper()), address, flags=re.IGNORECASE)
'123 N anywhere street'
>>>

Это имеет то преимущество, что регулярное выражение может игнорировать случай входной строки без ее модификации.

Если вы хотите работать только с полными словами, вы можете сделать это тоже с простой модификацией шаблона:

>>> pattern = r'\b({})\b'.format('|'.join(sorted(re.escape(k) for k in l)))
>>> address2 = "123 north anywhere southstreet"
>>> re.sub(pattern, lambda m: l.get(m.group(0).upper()), address2, flags=re.IGNORECASE)
'123 N anywhere southstreet'


Возможно, вы ищете iteritems():

d = {'NORTH':'N','SOUTH':'S','EAST':'E','WEST':'W'}
address = "123 north anywhere street"
for k,v in d.iteritems():
 address = address.upper().replace(k, v)

теперь находится '123 N ANYWHERE STREET'

Ну, если вы хотите сохранить регистр, пробелы и вложенные слова (например, Southstreet не должны преобразовываться в Sstreet), рассмотрите возможность использования этого простого списка:

import re
l = {'NORTH':'N','SOUTH':'S','EAST':'E','WEST':'W'}
address = "North 123 East Anywhere Southstreet West"
new_address = ''.join(l[p.upper()] if p.upper() in l else p for p in re.split(r'(\W+)', address))

new_address теперь

N 123 E Anywhere Southstreet W


Все эти ответы хороши, но вам не нужна подстановка строки python - она ​​простая и быстрая, но требует правильной отформатации строки.

address = "123 %(direction)s anywhere street"
print(address % {"direction": "N"})


Попробуйте,

import re
l = {'NORTH':'N','SOUTH':'S','EAST':'E','WEST':'W'}
address = "123 north anywhere street"
for k, v in l.iteritems():
 t = re.compile(re.escape(k), re.IGNORECASE)
 address = t.sub(v, address)
print(address)

licensed under cc by-sa 3.0 with attribution.