簡體   English   中英

在嵌套循環中更新字典

[英]update dictionary in nested loop

我在更新字典時遇到問題。 我只是在每個鍵中提取某些字段 - 但 output 與預期不同。 數據,預期 output 和代碼如下。 感謝觀看,感謝任何評論

categories = {'categories_a1' : [{'group': '13GH9', 'number': '1'},{'group': '17KPO', 'number': '73'}, {'group': '26BN11', 'number': '2'}, {'group': '813W', 'number': '99'}],
              'categories_a2' : [{'group': '99ITY', 'number': '12'},{'group': 'JH871', 'number': '15'}, {'group': 'OLH83', 'number': '99'}, {'group': '44RTQ', 'number': '1'}]} 

xpected= {'categories_a1' : [{'13GH9': '1'},{'17KPO':'73'}, {'26BN11':'2'}, {'813W': '99'}],
              'categories_a2' : [{'99ITY':'12'},{'JH871': '15'}, {'OLH83': '99'}, {'44RTQ':'1'}]} 
        

out={}
for k in categories.keys():
    for i in categories[k]:
        x = {k: v for k, v in zip([i['group']], [i['number']])}
    out[k] = x
out.update(out)

一種方法:

for key, value in categories.items():
    categories[key] = [{ d["group"] : d["number"] }  for d in value]

print(categories)

Output

{'categories_a1': [{'13GH9': '1'}, {'17KPO': '73'}, {'26BN11': '2'}, {'813W': '99'}], 'categories_a2': [{'99ITY': '12'}, {'JH871': '15'}, {'OLH83': '99'}, {'44RTQ': '1'}]}

讓我們首先清理一些普遍的怪異之處:

out.update(out)

這條線實際上什么也沒做,應該被省略。

x = {k: v for k, v in zip([i['group']], [i['number']])}

這沒有什么意義; 我們創建每個包含一個元素的列表並並行迭代它們。 我們可以很容易地直接使用這些值: x = {i['group']: i['number']}

將其換入后,讓我們考慮導致實際問題的部分:

for i in categories[k]:
    x = {i['group']: i['number']}
out[k] = x

這里的問題是您希望out[k]構成所有已修改字典的列表,但x被反復分配其中一個字典,然后結果變為out[k] 你大概打算做的是重復 append 那些字典到一個新的空列表:

x = []
for i in categories[k]:
    x.append({i['group']: i['number']})
out[k] = x

但是,很明顯您已經熟悉並熟悉推導式,這是使用推導式的理想場所:

out[k] = [{i['group']: i['number']} for i in categories[k]]

當然,我們可以將此技術擴展到整個循環:

out = {
    k: [{i['group']: i['number']} for i in v]
    for k, v in categories.items()
}

請仔細研究此代碼的結構並確保您了解該技術。 我們有一個要轉換的源字典來創建我們的 output,規則是:鍵保持不變,值(這是一個列表)進行自己的轉換。 因此,我們首先編寫 dict 理解的框架,使用.items()為我們提供鍵值對:

out = {
    k: # we need to fill in something to do with `v` here
    for k, v in categories.items()
}

然后我們弄清楚我們在用這個值做什么:列表的每個元素都是一個字典; 我們處理列表的方式是迭代的(輸入列表的每個元素都告訴我們要在 output 列表中使用的元素),但這些元素的處理不是(我們從該字典中查看兩個硬編碼值,並從他們那里聽寫)。 給定列表的一個元素i ,我們想要的對應dict恰好有一個鍵值對,我們可以計算為{i['group']: i['number']} 所以我們圍繞它包裝了一個列表理解: [{i['group']: i['number']} for i in v] ; 我們將它插入到 dict 理解框架中,給我們最終的結果。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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