【问题标题】:List comprehension getting values from JSON列表理解从 JSON 中获取值
【发布时间】:2020-02-26 22:48:36
【问题描述】:

我有这个不同级别的json:

[{'A': 1, 'B': 2, 'CA': {'CA1': '3', 'CA23': '4'}},
 {'A': 1, 'B': {'CA1': '3'}, 'CA': {'CA1': '3', 'CA23': '4'}}]

我只想使用列表理解获取每一行的值: 预期结果是:

[[1, 2, '3', '4'], [1, '3', '3', '4']]

不使用列表解析,此代码可以工作:

values = []

for row in json:
    rows = []
    for item in row.items():
        if str(row[item[0]]).startswith("{"):
            temp = row[item[0]].values()
        else:
            temp = [row[item[0]]]
        rows.extend(temp)

    values.append(rows)

一些想法?

【问题讨论】:

  • 我不会尝试将其放入列表理解中,而是首先考虑改进。例如,if str(row[item[0]]).startswith("{")不是你如何检查一个对象是否是一个dict,你应该使用isinstance(item[1], ),注意,使用@987654329的重点 @ 是您正在迭代键和值,通常,您会执行 for key, value in some_dict.items() 并且它只是 if isinstance(value, dict)...
  • 有什么问题? Stack Overflow 不是免费的代码编写服务,请参阅help center、How to Ask。
  • 我认为您不能将使用 extend() 的循环转换为列表理解。列表推导式每个输入元素只能生成一个输出元素。

标签: python json list-comprehension


【解决方案1】:

这是一种通过使用辅助辅助函数来展平包含数据结构的每一“行”的嵌套字典对象的方法。

import json  # For pretty-printing data and results.
from collections.abc import MutableMapping

def flatten(nested):
    ''' Yield values from nested dictionary data structure. '''
    for value in nested.values():
        if isinstance(value, MutableMapping):  # Nested?
            yield from flatten(value)
        else:
            yield value


json_values = [{'A': 1, 'B': 2, 'CA': {'CA1': '3', 'CA23': '4'}},
               {'A': 1, 'B': {'CA1': '3'}, 'CA': {'CA1': '3', 'CA23': '4'}}]

print('Before:')
print(json.dumps(json_values, indent=4))

# Here's the list comprehension.
result = [list(flatten(nested)) for nested in json_values]
print()
print('After:')
print(json.dumps(result, indent=4))

输出:

Before:
[
    {
        "A": 1,
        "B": 2,
        "CA": {
            "CA1": "3",
            "CA23": "4"
        }
    },
    {
        "A": 1,
        "B": {
            "CA1": "3"
        },
        "CA": {
            "CA1": "3",
            "CA23": "4"
        }
    }
]
After:
[
    [
        1,
        2,
        "3",
        "4"
    ],
    [
        1,
        "3",
        "3",
        "4"
    ]
]

【讨论】:

    猜你喜欢
    • 2020-11-25
    • 1970-01-01
    • 2013-07-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-12
    • 2015-01-28
    • 1970-01-01
    相关资源
    最近更新 更多