python - 使用笨拙的嵌套字典中的锯齿状列表中的过滤元素
问题描述
我有一个带有锯齿状列表 '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建议开放
解决方案
试试这个,它准确地再现了你想要的(包括排序)
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]
推荐阅读
- javascript - Javascript中的闭包 - 初学者问题
- python - 在python中用1 col创建数据框的差异
- c++ - C++ Fizzbuzz Leetcode 向量 push_back() 替换所有先前的元素
- sqlite - Flutter:为什么这个函数里面的方法没有访问数据库变量?
- java - 有没有办法找到安装在 OS X 上的 Java 版本的完整列表?
- java - 我应该在这个程序中传递什么参数以避免 java.lang 错误?
- r - 将另一列添加到数据框中,通过一个标签定义多个值的标签以绘制分组条形图
- python - 尽管成功登录,但用户身份验证失败
- html - CSS悬停在邻居上以切换属性
- python - scipy.optimize.curve_fit,参数全部返回 1