如何将字典元素动态分组到列表中


I have JSON file as mentioned below,
**test.json**
{
"header1" :
{
"header1_body1":
{
"some_key":"some_value",
.......................
},
"header1_body2":
{
"some_key":"some_value",
.......................
}
},
"header2":
{
"header2_body1":
{
"some_key":"some_value",
.......................
},
"header2_body2":
{
"some_key":"some_value",
.......................
}
}
}

希望将JSON内容分组到如下列表中:

header1 = ['header1_body1','header1_body2']
header2 = ['header2_body1','header2_body2']

CCD_ 1。因此,必须创建包含其值的动态列表,如上所示。

我怎样才能做到这一点?最佳的方法是什么?

解决方案:

with open('test.json') as json_data:
d = json.load(json_data)
for k,v in d.iteritems():
if k == "header1" or k == "header2":
globals()['{}'.format(k)] = d[k].keys()

现在,header1header2可以作为列表访问。

for i in header1:
print i

假设您将JSON读取到变量d中(可能使用JSON.loads(,则可以迭代键(排序?(并使用当前值的键构建列表:

for key in sorted(d.keys()):
l = [x for x in sorted(d[key].keys())]  # using list comprehension
print(key + ' = ' + str(l))

修复json结构:

{
"header1" :
{
"header1_body1":
{
"some_key":"some_value"
},
"header1_body2":
{
"some_key":"some_value"
}
},
"header2":
{
"header2_body1":
{
"some_key":"some_value"
},
"header2_body2":
{
"some_key":"some_value"
}
}
}

然后加载和创建列表:

header = []
for key, value in dictdump.items():
header.append(list(value.keys()))
for header_num in range(0, len(header)):
print("header{} : {}".format(header_num + 1, header[header_num]))

提供:

header1 : ['header1_body1', 'header1_body2']
header2 : ['header2_body1', 'header2_body2']

加载json后,您可以通过执行以下操作来获得任何键所需的列表(下面的headers变量是已加载json的占位符(。您不需要将其转换为列表以将其作为可迭代项使用,而是将其封装在list(...)中以匹配问题中的输出。

list(headers['header1'].keys())

如果您需要以某种可访问的格式存储每个"头"dict的键列表,那么您可以创建另一个包含所需列表的dictionary。例如:

import json
data = """{
"header1" : {
"header1_body1": {
"some_key":"some_value"
},
"header1_body2": {
"some_key":"some_value"
}
},
"header2": {
"header2_body1": {
"some_key":"some_value"
},
"header2_body2": {
"some_key":"some_value"
}
}
}"""
headers = json.loads(data)
# get the list of keys for a specific header
header = list(headers['header1'].keys())
print(header)
# ['header1_body1', 'header1_body2']
# if you really want to store them in another dict
results = {h[0]: list(h[1].keys()) for h in headers.items()}
print(results)
# OUTPUT
# {'header1': ['header1_body1', 'header1_body2'], 'header2': ['header2_body1', 'header2_body2']}

您可以使用递归:

d = {'header1': {'header1_body1': {'some_key': 'some_value'}, 'header1_body2': {'some_key': 'some_value'}}, 'header2': {'header2_body1': {'some_key': 'some_value'}, 'header2_body2': {'some_key': 'some_value'}}}
def flatten(_d):
for a, b in _d.items():
yield a
if isinstance(b, dict):
yield from flatten(b)
new_results = {a:[i for i in flatten(b) if i.startswith(a)] for a, b in d.items()}

输出:

{'header1': ['header1_body1', 'header1_body2'], 'header2': ['header2_body1', 'header2_body2']}
import json
with open('test.json') as json_data:
d = json.load(json_data)
for k,v in d.iteritems():
if k == "header1" or k == "header2":
globals()['{}'.format(k)] = d[k].keys()
now, `header1` and `header2` can be accessed as list.
for i in header1:
print i

最新更新