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

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

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~,依此类推在B中找到的所有my_iterable键。

我已经编写了一个函数来计算两个字符串之间的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_dict返回以下内容:

{'A':'xyz','B':'string6~','C':[{'B':'string4~','B':'string1~'}],'G':'jkl'
}

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

zhengbanririye 回答:获取嵌套可迭代的特定键,并检查其值是否存在于列表中

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

# 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~','string6~']
my_iterable = {'A':'xyz','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)
本文链接:https://www.f2er.com/3133425.html

大家都在问