簡體   English   中英

創建嵌套字典一個班輪

[英]create nested dictionary one liner

嗨我有三個列表,我想用一行創建一個三級嵌套字典。

l1 = ['a','b']
l2 = ['1', '2', '3']
l3 = ['d','e']

我想創建以下嵌套字典:

nd = {'a':{'1':{'d':0},{'e':0},'2':{'d':0},{'e':0},'3':{'d':0},{'e':0},'b':'a':{'1':{'d':0},{'e':0},'2':{'d':0},{'e':0},'3':{'d':0},{'e':0}}

我嘗試使用zip來執行外部循環並添加列表但是元素被替換。 即,這不起作用:

nd = {i:{j:{k:[]}} for i in zip(l1,l2,l3)}

zip不會在這里做。 zip連續迭代所有3個列表。 你需要的是產品 - 有效的3個嵌套循環。 您可以將其簡化為單個詞典理解,但需要考慮一些可讀性。

>>> {i : {j : {k : 0 for k in l3} for j in l2} for i in l1}

{'a': {'1': {'d': 0, 'e': 0}, 
       '2': {'d': 0, 'e': 0}, 
       '3': {'d': 0, 'e': 0}},
 'b': {'1': {'d': 0, 'e': 0}, 
       '2': {'d': 0, 'e': 0}, 
       '3': {'d': 0, 'e': 0}}
}

或者,如果您想要最底層的單鍵詞典列表(如您的o / p建議的那樣),

>>> {i : {j : [{k : 0} for k in l3] for j in l2} for i in l1}

{'a': {'1': [{'d': 0}, {'e': 0}],
       '2': [{'d': 0}, {'e': 0}],
       '3': [{'d': 0}, {'e': 0}]},
 'b': {'1': [{'d': 0}, {'e': 0}],
       '2': [{'d': 0}, {'e': 0}],
       '3': [{'d': 0}, {'e': 0}]}
}

您還可以使用更簡單的循環使用遞歸:

l1 = ['a','b']
l2 = ['1', '2', '3']
l3 = ['d','e']
def combinations(d):
  return {i:combinations(d[1:]) if d[1:] else 0 for i in d[0]}

print(combinations([l1, l2, l3]))

輸出:

{'b': {'1': {'d': 0, 'e': 0}, '2': {'d': 0, 'e': 0}, '3': {'d': 0, 'e': 0}}, 'a': {'1': {'d': 0, 'e': 0}, '2': {'d': 0, 'e': 0}, '3': {'d': 0, 'e': 0}}}

編輯:真單行:

print((lambda d:{i:combination(d[1:]) if d[1:] else 0 for i in d[0]})([l1, l2, l3]))

輸出:

{'b': {'1': {'d': 0, 'e': 0}, '2': {'d': 0, 'e': 0}, '3': {'d': 0, 'e': 0}}, 'a': {'1': {'d': 0, 'e': 0}, '2': {'d': 0, 'e': 0}, '3': {'d': 0, 'e': 0}}}

暫無
暫無

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

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