首页 > 解决方案 > 使用笨拙的嵌套字典中的锯齿状列表中的过滤元素

问题描述

我有一个带有锯齿状列表 'c' 的大型嵌套字典:

x = {'first_block': 
     {'unit1': {'a': (3,5,4), 'b': 23, 'c': [10]}, 
      'unit2': {'a': (5,8,7), 'b': 15, 'c': [20,10]}, 
      'unit10k': {'a': (2,4,9), 'b': 10, 'c': [6,10,20,5]}},
     
      'second_block': 
       {'unit1' : {'a': (8,20,14), 'b': 10, 'c': [17,12,9]}, 
        'unit2' : {'a': (9,25,50), 'b': 15, 'c': [17,15,9,4,12]}, 
        'unit12k': {'a': (12,24,9), 'b': 23, 'c': [12,22,15,4]}},
     
      'millionth_block': 
      {'unit1': {'a': (35,64,85), 'b': 64, 'c': [50]}, 
       'unit2': {'a': (56,23,34), 'b': 55, 'c': [89,59,77]},
       'unit5k': {'a': (90,28,12), 'b': 85, 'c': [48,90,27,59]}}}  

'c' 的元素是点标签。

对于“c”中的每个唯一点标签,我想生成“b”中相应值的过滤列表,

所以例如'first_block'在'c'中有独特的元素:5、6、10、20

我想为每个“块”获取/提取以下列表,以列出与“c”中的特定值关联的“b”的每个值,例如

first_block:
5: [10]
6: [10]
10: [10,15,23]
20: [10,15]
second_block:
4: [15,23]
9: [10,15]
12: [10,15,23]
15: [15,23]
17: [10,15]
22: [23]
etc.

鉴于“c”是锯齿状的,有关如何创建此结果的任何想法?

一直试图通过转换为 Awkward 数组来做到这一点,但文档目前很少,而且真的不明白如何在 Awkward 中做到这一点。

也对不涉及尴尬的pythonic建议开放

标签: pythondictionaryjagged-arraysawkward-array

解决方案


试试这个,它准确地再现了你想要的(包括排序)

x = {'first_block': 
     {'unit1': {'a': (3,5,4), 'b': 23, 'c': [10]}, 
      'unit2': {'a': (5,8,7), 'b': 15, 'c': [20,10]}, 
      'unit10k': {'a': (2,4,9), 'b': 10, 'c': [6,10,20,5]}},
     
      'second_block': 
       {'unit1' : {'a': (8,20,14), 'b': 10, 'c': [17,12,9]}, 
        'unit2' : {'a': (9,25,50), 'b': 15, 'c': [17,15,9,4,12]}, 
        'unit12k': {'a': (12,24,9), 'b': 23, 'c': [12,22,15,4]}},
     
      'millionth_block': 
      {'unit1': {'a': (35,64,85), 'b': 64, 'c': [50]}, 
       'unit2': {'a': (56,23,34), 'b': 55, 'c': [89,59,77]},
       'unit5k': {'a': (90,28,12), 'b': 85, 'c': [48,90,27,59]}}}  

results = {}

for key in x.keys(): # Block level key
    results[key] = {}

    for unit in x[key].keys(): # Unit level key in subdict
        for value in x[key][unit]['c']: #List of values in c
            if value not in results[key].keys():
                #You assign a c level key, create a list
                results[key][value] = []

            #And append values from b
            results[key][value].append(x[key][unit]['b'])

    #You sort your dict by key/item
    results[key] = dict(sorted(results[key].items()))

for key in results:
    print (key)
    for value in results[key].keys():
        print (value,results[key][value])

输出:

first_block
5 [10]
6 [10]
10 [23, 15, 10]
20 [15, 10]
second_block
4 [15, 23]
9 [10, 15]
12 [10, 15, 23]
15 [15, 23]
17 [10, 15]
22 [23]
millionth_block
27 [85]
48 [85]
50 [64]
59 [55, 85]
77 [55]
89 [55]
90 [85]

推荐阅读