繁体   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