如果子字符串与字典键匹配,则用字典值替换子字符串?

replace substring with dict value if the substring matches dict key?

我有一个字母数字字符串列表:

list = ["abc 123", "456 jkl"]

我还有一个字典,其中包含上面列表中字符串的子字符串作为键:

dict = {"abc":"xyz", "jkl":"stu"}

我想使用字典更新列表,使结果如下所示:

result = ["xyz 123", "456 stu"]

基本上,我想替换列表中匹配字典键和字典值的任何组件(并且只替换那个组件)。

我尝试遍历字典 + 列表来执行此操作,但我无法仅更新子字符串。我也想了解更多 efficient/pythonic 实现此目的的方法。

for element in list:
    for key,value in dictionary.items():
        if key in element:
            element = value
            

您可能会使用列表理解和 replace() 方法得到结果,如下所示 -

l = ["abc 123", "456 jkl"]
d = {"abc":"xyz", "jkl":"stu"}
l = [e.replace(key, val) for e in l for key, val in d.items() if key in e]
print(l)

简单的循环也可以。

但请记住,在此解决方案中,如果字典的任何键作为单词的一部分出现,也将被替换。如果您不想那样,则可以先拆分列表的元素以获得结果。或者你可以使用正则表达式来做到这一点

是这样的?您必须创建一个新列表(基于您的代码)

list = ["abc 123", "456 jkl"]
dict = {"abc":"xyz", "jkl":"stu"}
newDict = []
for element in list:
    for key,value in dict.items():
        if key in element:
            newElement = element.replace(key, value)
            newDict.append(newElement)
print newDict

如果你准备使用regex:

>>> import re
>>> result = re.sub(
                     r'\b'+r'|\b'.join(dct)+r'\b', 
                     lambda m: dct.get(m.group(), m.group()), 
                     ','.join(lst)                      
             ).split(',')
# or
>>> result = [re.sub(
                     r'\b'+r'|\b'.join(dct)+r'\b', 
                     lambda m: dct.get(m.group(), m.group()),
                     item
               ) for item in lst]
>>> result
["xyz 123", "456 stu"]

其中,

r'\b'+r'|\b'.join(dct)+r'\b'dct 的键与定界符 | 连接起来形成模式字符串。

lambda m: dct.get(m.group(), m.group()) 创建一个可调用对象,如果找到匹配项,returns 来自 dct 的匹配键的值,否则 returns 按原样匹配。

','.join(lst).split(',') 是一种无需循环即可执行此操作的方法,前提是您的字符串不包含逗号,否则可以使用其他分隔符。