如何根据另一个字典查找和替换一个字典中的值

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何根据另一个字典查找和替换一个字典中的值相关的知识,希望对你有一定的参考价值。

首先,我想说我问的问题很难以“紧凑”的方式提出,所以有些事情将在下面解释。

我有两个词典,让我们说这些是regex = {}dict = {}

其中第一个包含查找和替换模式分别为keysvalues。所以它看起来像这样:

# 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,来自valueXdict我想检查,如果valueX包括来自findXregex,如果是的话,我想用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_values重复keyXs。我知道迭代我的词典(可能是正则表达式字典)有问题,但我不知道如何解决这个问题。


编辑(例子):

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'}

以上是关于如何根据另一个字典查找和替换一个字典中的值的主要内容,如果未能解决你的问题,请参考以下文章

从大字典中替换 DataFrame 中的值的更好方法

Pandas:根据另一列的键在现有列上映射字典值以替换 NaN

Java中的Hashtable如何根据值获取键?

Swift - 使用 swiftyJSON 根据字典中的值查找字典数组的索引

如何根据对应的值过滤字典键

根据字典替换数据框列中的值不起作用[重复]