如果子字符串与字典键匹配,则用字典值替换子字符串?
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(',')
是一种无需循环即可执行此操作的方法,前提是您的字符串不包含逗号,否则可以使用其他分隔符。
我有一个字母数字字符串列表:
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(',')
是一种无需循环即可执行此操作的方法,前提是您的字符串不包含逗号,否则可以使用其他分隔符。