【问题标题】:Create List from Nested Dictionary从嵌套字典创建列表
【发布时间】:2018-01-16 08:26:56
【问题描述】:

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

【问题讨论】:

  • while循环的作用是什么?第一行似乎应该完成这项工作

标签: python list dictionary


【解决方案1】:

您可以像这样使用 列表推导

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

请注意,每个内部字典的键顺序不能保证,因为字典在 中没有排序

【讨论】:

    【解决方案2】:

    此列表推导对格式错误的数据更加宽容(例如,它会忽略不包含 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())
    

    【讨论】:

    • 谢谢,这非常适合在 JSON 中实现灵活性。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-04-04
    • 2021-11-20
    • 2021-04-19
    • 1970-01-01
    • 2020-10-22
    • 2021-09-15
    相关资源
    最近更新 更多