簡體   English   中英

根據重復值從字典創建嵌套字典

[英]Create a nested dictionary from a dictionary based on repeated values

我是Python(3.6)的新手,我試圖找出一種從列表列表中創建嵌套字典的方法。 輸入示例為:

myList = [[1, B, C],[1, D, C],[1, E, C],[1, F, G],[1, H, G],[2, I, C],[2, J, C],[2, K, G]]

我想要得到的是:

result = {1: {C: [B, D, E], G: [F, H]}, 2: {C: [I, J], G: [K]}}

我現在所擁有的是:

result = defaultdict(list)
for key, *values in myList:
    result[key].extend(values)

這給了我輸出:

{1: [B, C, D, C, E, C, F, G, H, G], 2: [I, C, J, C, K, G]}

我正在尋找一種創建嵌套字典的方法,其中鍵值列表中的每個重復值都將成為子詞典的鍵。 您能否建議我在處理大型數據集時可以考慮哪些方法? 到目前為止,我做的一個主要缺陷是,我松散了應該為子詞典的哪個鍵分配哪個值的信息。

您可以在此處使用defaultdict ,但僅傳遞list將不起作用,因為您不希望其值是list的dict。 您需要一個值是dict的dict,每個dict的值都是列表。 因此,您必須將defaultdict的第二層傳遞給第一個defaultdict

from collections import defaultdict

seq = [[1, 'B', 'C'],[1, 'D', 'C'],[1, 'E', 'C'],[1, 'F', 'G'],[1, 'H', 'G'],[2, 'I', 'C'],[2, 'J', 'C'],[2, 'K', 'G']]
d = defaultdict(lambda: defaultdict(list))
for key1, value, key2 in seq:
    d[key1][key2].append(value)

print(d)

結果:

defaultdict(<function <lambda> at 0x00DEC6A8>, {1: defaultdict(<class 'list'>, {'C': ['B', 'D', 'E'], 'G': ['F', 'H']}), 2: defaultdict(<class 'list'>, {'C': ['I', 'J'], 'G': ['K']})})

...逐項等效於{1: {'C': ['B', 'D', 'E'], 'G': ['F', 'H']}, 2: {'C': ['I', 'J'], 'G': ['K']}}

您可以結合使用itertools.groupby和遞歸來處理帶有任意長度的子列表的輸入:

import itertools
keys = [[lambda x:x[0], lambda x:x[1:]], [lambda x:x[-1], lambda x:x[:-1]]]
l = [[1, 'B', 'C'],[1, 'D', 'C'],[1, 'E', 'C'],[1, 'F', 'G'],[1, 'H', 'G'],[2, 'I', 'C'],[2, 'J', 'C'],[2, 'K', 'G']]
def group_result(d, keys):
  k, splice = keys[0]
  c = {a:[splice(i) for i in b] for a, b in itertools.groupby(sorted(d, key=k), key=k)}
  return {a:group_result(b, keys[1:]) if keys[1:] else [i for c in b for i in c] for a, b in c.items()}

print(group_result(l, keys))

輸出:

{1: {'C': ['B', 'D', 'E'], 'G': ['F', 'H']}, 2: {'C': ['I', 'J'], 'G': ['K']}}

暫無
暫無

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

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