[英]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.