Понимание списка, получение значений от JSON - PullRequest
0 голосов
/ 27 февраля 2020

У меня есть 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)

Некоторые идеи?

1 Ответ

0 голосов
/ 27 февраля 2020

Вот способ сделать это, немного обманывая, используя вспомогательную вспомогательную функцию, чтобы сгладить вложенные словарные объекты, составляющие каждую «строку» вашей структуры данных.

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"
    ]
]
...