Python - как получить все значения вложенных словарей в один List [dict]? - PullRequest
2 голосов
/ 03 августа 2020

Я пытаюсь проанализировать этот список, чтобы получить единственный List[dict], содержащий словари с данными для всех метри c типов.

metrics_info = [
    {
        "metric_type1": [
            {
                "name": "m10",
                "score": "11"
            },
            {
                "name": "m20",
                "score": "790"
            }
        ]},
    {
        "metric_type2": [
            {
                "name": "m30",
                "score": "245"

            }
        ]}
]

На данный момент я создал метод, который позволяет чтобы получить список словаря для определенного c метри c типа:

def parse_metrics(metrics_info: List[dict], metric_type: str) -> List[dict]:
    for item in metrics_info:
        if metric_type in item:
            return item[metric_type]

Как я могу получить список [dict], содержащий внутренние словари для всех метри c типов?

Результат должен выглядеть так:

[
            {
                "name": "m10",
                "score": "11"
            },
            {
                "name": "m20",
                "score": "790"
            },
            {
                "name": "m30",
                "score": "245"
            }
]

Ответы [ 3 ]

1 голос
/ 03 августа 2020

Может быть способ получше, но он должен сработать:

meterics_info = [ ... ]
all_values = []
for d in metrics_info:
    all_values.extend(d.values())
0 голосов
/ 03 августа 2020

Другой способ сделать это через понимание списка:

b=[]
[b.append(y) for i in metrics_info  for x,y in i.items()]
print(b)
0 голосов
/ 03 августа 2020

Итак, я внес небольшую поправку в ответ монкута. Их возвращает список списков. Похоже, вы ищете сплющенный список. У меня есть два способа сделать это: один использует циклы, а другой использует функциональные методы из python.

all_values= [item for _list in map(lambda _dict: list(_dict.values())[0], metrics_info) for item in _list]

ИЛИ

all_values = []
for _dict in metrics_info:
    for value in list(_dict.values()):
        all_values.extend(value)

Оба производят тот же результат, который вы ищете. Сглаженный список.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...