Python 获取嵌套iterable的特定键,并检查其值是否存在于列表中

Python 获取嵌套iterable的特定键,并检查其值是否存在于列表中,python,loops,dictionary,string-matching,Python,Loops,Dictionary,String Matching,我试图访问嵌套字典中的特定键,然后将其值与列表中的字符串匹配。如果列表中的字符串包含字典值中的字符串,我想用列表值覆盖字典值。下面是一个例子 my_list = ['string1~', 'string2~', 'string3~', 'string4~', 'string5~', 'string6~'] my_iterable = {'A':'xyz', 'B':'string6', 'C':[{'B':'string4', 'D

我试图访问嵌套字典中的特定键,然后将其值与列表中的字符串匹配。如果列表中的字符串包含字典值中的字符串,我想用列表值覆盖字典值。下面是一个例子

my_list = ['string1~', 'string2~', 'string3~', 'string4~', 'string5~', 'string6~']
my_iterable = {'A':'xyz', 
               'B':'string6', 
               'C':[{'B':'string4', 'D':'123'}], 
               'E':[{'F':'321', 'B':'string1'}], 
               'G':'jkl'
               }
我正在寻找的键是
B
,目标是用
string6~
覆盖
string6
,用
string4~
覆盖
string4
,等等来覆盖
myiterable
中找到的所有
B

我已经编写了一个函数来计算两个字符串之间的Levenshtein距离,但是我正在努力编写一个有效的方法来覆盖键的值

def find_and_replace(key, dictionary, original_list):
    for k, v in dictionary.items():
        if k == key:
            #function to check if original_list item contains v
            yield v
        elif isinstance(v, dict):
            for result in find_and_replace(key, v, name_list):
                yield result
        elif isinstance(v, list):
            for d in v:
                if isinstance(d, dict):
                    for result in find_and_replace(key, d, name_list):
                        yield result
如果我打电话

updated_dict = find_and_replace('B', my_iterable, my_list)
我想
updated\u dict
返回以下内容:

{'A':'xyz', 
 'B':'string6~', 
 'C':[{'B':'string4~', 'D':'123'}], 
 'E':[{'F':'321', 'B':'string1~'}], 
 'G':'jkl'
}

这是最有效的解决方案的正确方法吗?我如何修改它以返回带有
B
更新值的字典?

您可以使用下面的代码。我假设输入dict的结构在整个执行过程中是相同的

# Input List
my_list = ['string1~', 'string2~', 'string3~', 'string4~', 'string5~', 'string6~']

# Input Dict
# Removed duplicate key "B" from the dict
my_iterable = {'A':'xyz', 
               'B':'string6', 
               'C':[{'B':'string4', 'D':'123'}], 
               'E':[{'F':'321', 'B':'string1'}], 
               'G':'jkl',
               }

# setting search key
search_key = "B"

# Main code
for i, v in my_iterable.items():
    if i == search_key:
        if not isinstance(v,list):
            search_in_list = [i for i in my_list if v in i]
            if search_in_list:
                my_iterable[i] = search_in_list[0]
    else:
        try:
            for j, k in v[0].items():
                if j == search_key:
                    search_in_list = [l for l in my_list if k in l]
                    if search_in_list:
                        v[0][j] = search_in_list[0]
        except:
            continue

# print output
print (my_iterable)
# Result -> {'A': 'xyz', 'B': 'string6~', 'C': [{'B': 'string4~', 'D': '123'}], 'E': [{'F': '321', 'B': 'string1~'}], 'G': 'jkl'}  
使用列表理解或使用 函数


我希望这有帮助,也很重要

在某些情况下,如果嵌套有点复杂,可以将字典视为json字符串并进行各种替换。这可能不是人们所说的非常pythonic,但它给了你更多的灵活性

import re, json

my_list = ['string1~', 'string2~', 'string3~', 'string4~', 'string5~', 'string6~']
my_iterable = {'A':'xyz', 
               'B':'string6', 
               'C':[{'B':'string4', 'D':'123'}], 
               'E':[{'F':'321', 'B':'string1'}], 
               'G':'jkl'}

json_str = json.dumps(my_iterable, ensure_ascii=False)
for val in my_list:
    json_str = re.sub(re.compile(f"""("[B]":\\W?")({val[:-1]})(")"""), r"\1" + val + r"\3", json_str)
my_iterable = json.loads(json_str)
print(my_iterable)

为什么您的
dict
中有类似的键?在我写问题时错误地添加了。编辑问题以删除重复密钥。