簡體   English   中英

列表中的嵌套字典

[英]nested dictionary from lists

我有三個列表(列表)- index_1index_2index_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.

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