2017-08-08 176 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