如何根据另一个字典查找和替换一个字典中的值
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何根据另一个字典查找和替换一个字典中的值相关的知识,希望对你有一定的参考价值。
首先,我想说我问的问题很难以“紧凑”的方式提出,所以有些事情将在下面解释。
我有两个词典,让我们说这些是regex = {}
和dict = {}
。
其中第一个包含查找和替换模式分别为keys
和values
。所以它看起来像这样:
# about 50 key/value pairs
regex = {
'find1' : 'replace1',
'find2' : 'replace2',
...
'findX' : 'replaceX'
}
第二个看起来像这样:
# about 500,000 key/value pairs
dict = {
'key1' : 'value1',
'key2' : 'value2',
...
'keyX' : 'valueX'
}
对于每个keyX
,来自valueX
的dict
我想检查,如果valueX
包括来自findX
的regex
,如果是的话,我想用replaceX
替换它并保存到相同的(dict
)或新的字典或列表(使用新的列表中的代码如下)。
我试过这段代码:
for keyX, valueX in dict.items():
for patterns in regex.items():
if re.search(patterns[0], valueX)
new_value = re.sub(patterns[0], patterns[1], valueX)
new_line = keyX + '\t' + new_value
new_list.append(new_line)
我的机制工作错误:对于每个valueX
它应该检查它是否包含任何findX
,用replaceX
替换它,保存,但是我在输出列表中得到了相当混乱。对于不同的new_value
s重复keyX
s。我知道迭代我的词典(可能是正则表达式字典)有问题,但我不知道如何解决这个问题。
编辑(例子):
regex = {
's t n': 's n',
'e0': 'i0',
'j a0': 'j i0'
}
dict = {
'известный': 'i0 z vj e1 s t n y0 j',
'сестра': 'sj e0 s t r a1'
'январь': 'j a0 n v a1 rj'
}
答案
尝试:
regex = {
's t n': 's n',
'e0': 'i0',
'j a0': 'j i0'
}
dict = {
'известный': 'i0 z vj e1 s t n y0 j',
'сестра': 'sj e0 s t r a1',
'январь': 'j a0 n v a1 rj'
}
for k1,v1 in regex.items():
for k2,v2 in dict.items():
if k1 in v2:
dict[k2]=dict[k2].replace(k1,v1)
你得到:
dict
{'известный': 'i0 z vj e1 s n y0 j',
'сестра': 'sj i0 s t r a1',
'январь': 'j i0 n v a1 rj'}
另一答案
您可以过滤密钥并组织它们后面循环的元组列表,并相应地替换您的值,如下所示:
# init vars
regex = {'s t n': 's n', 'e0': 'i0', 'j a0': 'j i0'}
d = {'известный': 'i0 z vj e1 s t n y0 j', 'сестра': 'sj e0 s t r a1', 'январь': 'j a0 n v a1 rj'}
# debug prints
print(regex)
print(d)
# get keys for replacements
import itertools
tuples = list(itertools.chain.from_iterable([[(keyx, findx) for keyx in d.keys() if findx in d[keyx]] for findx in regex.keys()]))
# loop and replace
for keyx, findx in tuples:
d[keyx] = d[keyx].replace(findx, regex[findx])
# print output
print(d)
输出:
{'s t n': 's n', 'e0': 'i0', 'j a0': 'j i0'}
{'известный': 'i0 z vj e1 s t n y0 j', 'сестра': 'sj e0 s t r a1', 'январь': 'j a0 n v a1 rj'}
{'известный': 'i0 z vj e1 s n y0 j', 'сестра': 'sj i0 s t r a1', 'январь': 'j i0 n v a1 rj'}
以上是关于如何根据另一个字典查找和替换一个字典中的值的主要内容,如果未能解决你的问题,请参考以下文章
Pandas:根据另一列的键在现有列上映射字典值以替换 NaN