簡體   English   中英

有沒有辦法從嵌套字典中訪問一個值並根據搜索列表更新同一個字典中的值?

[英]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_1dict_2
  • 然后在 for 循環的前三行中,我去掉了數字中不必要的部分(因為我們只想檢查前三位數)
  • 然后我正在檢查密鑰'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()方法),如果是:
        • 更新 dict 條目並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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM