[英]is there a way to access a value from a nested dict and update value in the same dict based on searching a list?
dict_1 = {'key1': {'Type': '51', 'dn_range': 203, 'soft_DN': nan}}
{'key2': {'Type': '51', 'dn_range': 204, 'soft_DN': nan}}
A_list = [2031111, 2031112, 2031113, 2042222, 2042223]
我的目標是搜索 A_list 以找到以 203 和 204(2031111 和 2042222)開頭的第一個 integer 並更新相應的 soft_DN 值。
更新后的 dict 應如下所示:
dict_1 = {'key1': {'Type': '51', 'dn_range': 203, 'soft_DN': 2031111}}
{'key2': {'Type': '51', 'dn_range': 204, 'soft_DN': 2042222}}
首先你的 dict 格式不正確,我想它應該是這樣的:
dict_1 = {'key1': {'Type': '51', 'dn_range': 203, 'soft_DN': None},
'key2': {'Type': '51', 'dn_range': 204, 'soft_DN': None}}
這樣做的簡單方法是將數字轉換為字符串,然后將前 3 個字符與dn_range
進行比較
>>> int(str(2031111)[:3])
203
也就是說,我不知道您的數據集有多大,如果它非常大,您希望通過減少在迭代字典時循環列表的次數來節省時間。 為此,我建議使用itertools.groupby
來獲取鍵的字典,即整數的前 3 位數字,值是顯示的第一個 integer。 也就是說,請確保您的整數按前 3 個字符組合在一起,否則您將需要另一種方法來執行此操作。
from itertools import groupby
ranges = {int(k): next(v) for k, v in groupby(A_list, key=lambda i: str(i)[:3])}
結果:
{203: 2031111, 204: 2042222}
然后只需遍歷字典並替換值
for k, d in dict_1.items():
d['soft_DN'] = ranges.get(d['dn_range'])
結果:
{'key1': {'Type': '51', 'dn_range': 203, 'soft_DN': 2031111}, 'key2': {'Type': '51', 'dn_range': 204, 'soft_DN': 2042222}}
下面的代碼將按您的意願工作:
dict_1 = {'key1': {'Type': '51', 'dn_range': 203, 'soft_DN': -1}}
dict_2 = {'key2': {'Type': '51', 'dn_range': 204, 'soft_DN': -1}}
A_list = [2031111, 2031112, 2031113, 2042222, 2042223]
for i, x in enumerate(A_list):
#Get rid of unnecessary part
x = str(x)
x = x[:3]
x = int(x)
if x == dict_1["key1"]["dn_range"] and dict_1["key1"]["soft_DN"] == -1:
dict_1["key1"]["soft_DN"] = A_list[i]
if x == dict_2["key2"]["dn_range"] and dict_2["key2"]["soft_DN"] == -1:
dict_2["key2"]["soft_DN"] = A_list[i]
print(dict_1, dict_2)
dict_1
和dict_2
。'dn_range'
。 如果數字匹配 - 然后將-1
重寫為第一個好的數字。假設“A_list 中的第一個 integer ...”表示第一個索引(與最小的索引相反,以防列表未排序),那么您可以遍歷字典並搜索字典中每個條目的 A_list:
for key, entry in dict_1.items():
dn_range = entry["dn_range"]
for dn in A_list:
if dn_range * 10000 <= dn < dn_range + 1 * 10000:
entry["soft_DN"] = dn
break
如果 A_list 已排序,那么您可以進行二進制搜索以找到目標 dn 值,而不是一個一個地遍歷列表。 這將大大加快您的算法。
我想 Python 沒有魔法。 我只想:
dict_1
的條目並為每個條目:
dn_range
字段A_list
的項目並為每個項目:
dn_range
(字符串表示在這里可以提供幫助,字符串有一個startsWith()
方法),如果是:
break
列表迭代循環。Python 循環很像偽代碼循環,易於編寫和閱讀。 你會愛上它們: 提示:
for key, value in dict_1.items():
for item in A_list:
if str(my_item).startsWith(str(d_range)):
足夠的提示,快樂的編碼!
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.