[英]Get specific key of a nested iterable and check if its value exists in a list
我正在尝试访问嵌套字典中的特定键,然后将其值与列表中的字符串匹配。 如果列表中的字符串包含字典值中的字符串,我想用列表值覆盖字典值。 下面是一个例子。
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~
覆盖string6
,用string4~
覆盖 string4 ,依此类推,用于在string4
中my_iterable
的所有B
键。
我写了一个 function 来计算两个字符串之间的 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~', 'D':'123'}],
'E':[{'F':'321', 'B':'string1~'}],
'G':'jkl'
}
这是最有效解决方案的正确方法吗?如何修改它以返回包含B
更新值的字典?
您可以使用以下代码。 我假设输入字典的结构在整个执行过程中是相同的。
# 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'}
上面可以使用列表理解或使用 function 进行优化的 scope
我希望这会有所帮助并且很重要!
在某些情况下,如果您的嵌套有点复杂,您可以将字典视为 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)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.