你能用Python中的字典值编写str.replace()吗?

use*_*457 25 python dictionary str-replace

我必须在地址字段中用NS替换北,南等.

如果我有

list = {'NORTH':'N','SOUTH':'S','EAST':'E','WEST':'W'}
address = "123 north anywhere street"
Run Code Online (Sandbox Code Playgroud)

我可以迭代我的字典值来替换我的地址字段吗?

for dir in list[]:
   address.upper().replace(key,value)
Run Code Online (Sandbox Code Playgroud)

我知道我甚至不是很亲密!但是如果您可以使用这样的字典值,那么任何输入都会受到赞赏.

ric*_*ier 19

address = "123 north anywhere street"

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

既简洁又简洁.


Dun*_*can 13

我认为还没有人建议的一种选择是构建一个包含所有键的正则表达式,然后简单地对字符串进行一次替换:

>>> 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'
>>> 
Run Code Online (Sandbox Code Playgroud)

这样做的好处是正则表达式可以忽略输入字符串的大小写而不对其进行修改。

如果您只想对完整的单词进行操作,那么您也可以通过对模式进行简单的修改来做到这一点:

>>> 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'
Run Code Online (Sandbox Code Playgroud)


slo*_*oth 8

您可能正在寻找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)
Run Code Online (Sandbox Code Playgroud)

地址是现在 '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))
Run Code Online (Sandbox Code Playgroud)

new_address 现在是

N 123 E Anywhere Southstreet    W
Run Code Online (Sandbox Code Playgroud)


fra*_*lau 6

用字典“翻译”一个字符串是一个非常普遍的要求。我提出了一个您可能希望保留在工具包中的函数:

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
Run Code Online (Sandbox Code Playgroud)

然后你可以写:

>>> a = {'hello':'bonjour', 'world':'tout-le-monde'}
>>> translate('hello world', a)
'bonjour tout-le-monde'
Run Code Online (Sandbox Code Playgroud)


Tra*_*gar 6

我建议使用正则表达式而不是简单的替换。通过替换,您可能会面临单词子部分被替换的风险,这可能不是您想要的。

import json
import re

with open('filePath.txt') as f:
   data = f.read()

with open('filePath.json') as f:
   glossar = json.load(f)

for word, initial in glossar.items():
   data = re.sub(r'\b' + word + r'\b', initial, data)

print(data)
Run Code Online (Sandbox Code Playgroud)


小智 6

如果您正在寻找一种简洁的方法,您可以从 functools 中使用reduce:

from functools import reduce

str_to_replace = "The string for replacement."
replacement_dict = {"The ": "A new ", "for ": "after "}

str_replaced = reduce(lambda x, y: x.replace(*y), [str_to_replace, *list(replacement_dict.items())])
print(str_replaced)
Run Code Online (Sandbox Code Playgroud)


Sam*_*zzo 5

您很接近,实际上:

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

注意:对于Python 3用户,您应该使用.keys()而不是.iterkeys()

dictionary = {"NORTH":"N", "SOUTH":"S" } 
for key in dictionary.keys():
    address.upper().replace(key, dictionary[key])
Run Code Online (Sandbox Code Playgroud)

  • 这怎么是正确的呢?`address.upper().replace(...)` 不会修改任何内容,它只是返回一个值,并且不会被分配给任何内容。 (11认同)
  • 如果您愿意,可以使用“for key, value indictionary.items()”同时迭代字典的键和值。我不知道它在性能方面是否有优势,但我认为它更Pythonic (2认同)

Art*_*kov 5

def replace_values_in_string(text, args_dict):
    for key in args_dict.keys():
        text = text.replace(key, str(args_dict[key]))
    return text
Run Code Online (Sandbox Code Playgroud)

  • 请提供您的代码的解释,以提高您的答案的质量 (2认同)