2017-08-08 180 views
1

我想创建一个由字典键组成的列表,但这些字典嵌套在列表中。例如,给定下面的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) 
+0

什么是while循环的功能是什么?这似乎是第一行应该做的工作 – TallChuck

回答

1

这个列表解析是更宽容到格式不正确的数据(例如它会忽略不包含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

3

可以使用列表理解像这样:

lst = [k for d in dct['test_cases'] for k in d['variables'].keys()] 
# ['var1', 'var2', 'var4', 'var3'] 

注意,对于每个内部字典的键的顺序不能保证,因为类型的字典中未<有序的Python 3.6