68

アドレスフィールドで、北、南などをNSに置き換える必要があります。

私が持っている場合

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

辞書の値を繰り返し処理してアドレスフィールドを置き換えることはできますか?

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

私も近くにいないことを知っています!ただし、このようなディクショナリ値を使用できる場合は、任意の入力をいただければ幸いです。

4

12 に答える 12

56
address = "123 north anywhere street"

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

素晴らしく簡潔で読みやすい。

于 2013-01-04T12:15:19.810 に答える
19

あなたは実際に近いです:

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

注: Python 3 ユーザーの場合は、.keys()代わりに次を使用する必要があります.iterkeys()

dictionary = {"NORTH":"N", "SOUTH":"S" } 
for key in dictionary.keys():
    address = address.upper().replace(key, dictionary[key])
于 2013-01-04T11:44:54.657 に答える
17

まだ誰も提案していないと思うオプションの1つは、すべてのキーを含む正規表現を作成してから、文字列に対して1つの置換を実行することです。

>>> 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'
于 2013-01-04T13:07:25.120 に答える
10

あなたはおそらく探している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
于 2013-01-04T11:44:50.140 に答える
2

との両方を使用するreplace()format()、それほど正確ではありません。

data =  '{content} {address}'
for k,v in {"{content}":"some {address}", "{address}":"New York" }.items():
    data = data.replace(k,v)
# results: some New York New York

'{ {content} {address}'.format(**{'content':'str1', 'address':'str2'})
# results: ValueError: unexpected '{' in field name

正確な場所re.sub()が必要な場合は、次のように翻訳することをお勧めします。

import re
def translate(text, kw, ignore_case=False):
    search_keys = map(lambda x:re.escape(x), kw.keys())
    if ignore_case:
        kw = {k.lower():kw[k] for k in kw}
        regex = re.compile('|'.join(search_keys), re.IGNORECASE)
        res = regex.sub( lambda m:kw[m.group().lower()], text)
    else:
        regex = re.compile('|'.join(search_keys))
        res = regex.sub( lambda m:kw[m.group()], text)

    return res

#'score: 99.5% name:%(name)s' %{'name':'foo'}
res = translate( 'score: 99.5% name:{name}', {'{name}':'foo'})
print(res)

res = translate( 'score: 99.5% name:{NAME}', {'{name}':'foo'}, ignore_case=True)
print(res)
于 2018-10-02T15:03:55.370 に答える