从嵌套字典创建列表
问题描述:
我想创建一个由字典键组成的列表,但这些字典嵌套在列表中。例如,给定下面的JSON:从嵌套字典创建列表
{
"test_cases": [{
"name": "first request",
"request": {
"url": "{{env_base_url}}/v2/597649d3110000be08b1be84/{{env_userName}}"
},
"variables": {
"var1": "some stuff",
"var2": "some other stuff"
}
},
{
"name": "second request",
"request": {
"url": "{{env_base_url}}/v2/597649d3110000be08b1be84/{{env_userName}}"
},
"variables": {
"var3": "some new stuff",
"var4": "some other new stuff"
}
}
]
}
我想创造一切从每个test_case的变量键的列表 - 示例输出将是:
list = ['var1', 'var2', 'var3', 'var4]
我有实现这个代码,但似乎过于复杂...
test_var_names = [list(test['variables'].keys()) for test in data['test_cases']]
i =0
while i < len(test_var_names):
test_var_name = test_var_names[i]
if isinstance(test_var_name, list):
for item in test_var_name:
test_var_names.append(item)
test_var_names.remove(test_var_name)
i = i-1
i += 1
print (test_var_names)
答
这个列表解析是更宽容到格式不正确的数据(例如它会忽略不包含variables
的数据)。
d = {
"test_cases": [{
"name": "first request",
"request": {
"url": "{{env_base_url}}/v2/597649d3110000be08b1be84/{{env_userName}}"
},
"variables": {
"var1": "some stuff",
"var2": "some other stuff"
}
},
{
"name": "second request",
},
{
"name": "third request",
"request": {
"url": "{{env_base_url}}/v2/597649d3110000be08b1be84/{{env_userName}}"
},
"variables": {
"var3": "some new stuff",
"var4": "some other new stuff"
}
}
]
}
>>> [var
for sublist in [case.get('variables', {}).keys() for case in d.get('test_cases', [])]
for var in sublist]
['var1', 'var2', 'var4', 'var3']
虽然上面的代码是有效的,这是更易读:
variables = []
items = d.get('test_cases')
for item in items:
variables.extend(item.get('variables', {}).keys())
+0
谢谢,这是完美的,让JSON的灵活性。 – cdm
答
可以使用列表理解像这样:
lst = [k for d in dct['test_cases'] for k in d['variables'].keys()]
# ['var1', 'var2', 'var4', 'var3']
注意,对于每个内部字典的键的顺序不能保证,因为类型的字典中未<有序的Python 3.6
什么是while循环的功能是什么?这似乎是第一行应该做的工作 – TallChuck