[英]nested dictionary from lists
我有三個列表(列表)- index_1
, index_2
和index_3
。 我想將它們結合起來制作一個嵌套字典。 字典頂層的鍵應該是index_1 = ['item1','item2','item3']
。 第二級應該由index_2
(它具有對應於'item1'
、 'item2'
和'item3'
3 個元素)作為鍵。 字典第二級中的值應包含值並存儲在index_3
中的列表中。
我有點卡住了,認為我正在創建如下所示的過於復雜的循環。 任何評論都會很棒。
# input lists
index_1 = ['item1', 'item2', 'item3']
index_2 = [['a', 'b', 'c'], ['d', 'e', 'f'], ['g', 'h', 'i']]
index_3 = [[0, 1, 2, 3, 4], [99, 100], [0, 1, 2]]
# desired output
my_dict = {'item1' : {'a' : [0, 1, 2, 3, 4], 'b' : [0, 1, 2, 3, 4], 'c' : [0, 1, 2, 3, 4]},
'item2' : {'d' : [99, 100], 'e' : [99, 100], 'f' : [99, 100]},
'item3' : {'g' : [0, 1, 2], 'h' : [0, 1, 2], 'i' : [0, 1, 2]}}
# my loop that didnt work
d = defaultdict(defaultdict)
for i in range(len(index_1)):
for x, y, z in zip([index_1[i]], [index_2[i]], [index_3[i]]):
d[x][y] = [z]
您可以與zip
多個列表,例如,
zip(index_1, index_2, index_3)
在每一步中,第一個元素是鍵,接下來的元素構成嵌套字典。 嵌套字典可以由dict.fromkeys
制作,只要您可以在所有值中具有相同的引用:
d = {}
for k, nk, nv in zip(index_1, index_2, index_3):
d[k] = dict.fromkeys(nk, nv)
否則,您需要為每個元素創建一個新列表:
d = {}
for k, nk, nv in zip(index_1, index_2, index_3):
d[k] = {kk: list(nv) for kk in nk}
list(nv)
, nv[:]
和nv.copy()
都是慣用的,並且是 python 以一種正確的方式做事的理想的“例外證明規則”的一個很好的例子。
您現在可以將整個事情簡化為嵌套字典理解:
d = {k: {kk: list(nv) for kk in nk} for k, nk, nv in zip(index_1, index_2, index_3)}
你不需要defaultdict
或那個額外的循環,你可以像下面這樣將它們一起zip
:
index_1 = ['item1', 'item2', 'item3']
index_2 = [['a','b','c'], ['d','e','f'], ['g','h','i']]
index_3 = [[0,1,2,3,4],[99,100], [0,1,2]]
dic = {}
for x, y, z in zip(index_1, index_2, index_3):
dic[x] = {}
for k in y:
dic[x][k] = z[:]
z[:]
是為了確保創建一個新列表並且不會為所有鍵重用相同的引用。
如果您想使用dic = defaultdict(defaultdict)
,此代碼仍然有效,好處是您可以從循環中省略dic[x] = {}
。 不過,對於帶有defaultdict(dict)
的 go 可能更有意義,因為嵌套的默認字典沒有任何好處。
你可以做:
index_1 = ['item1', 'item2', 'item3']
index_2 = [['a','b','c'], ['d','e','f'], ['g','h','i']]
index_3 = [[0,1,2,3,4],[99,100], [0,1,2]]
vals=zip(index_2, index_3)
di={}
for k1 in index_1:
ct=next(vals)
di[k1]={k:ct[1] for k in ct[0]}
如果您希望內部的各個列表是副本,請執行以下操作:
di[k1]={k:list(ct[1]) for k in ct[0]}
無論哪種情況:
>>> di
{'item1': {'a': [0, 1, 2, 3, 4], 'b': [0, 1, 2, 3, 4], 'c': [0, 1, 2, 3, 4]}, 'item2': {'d': [99, 100], 'e': [99, 100], 'f': [99, 100]}, 'item3': {'g': [0, 1, 2], 'h': [0, 1, 2], 'i': [0, 1, 2]}}
給定您的示例 output:
>>> di==my_dict
True
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.