Указание вложенного словарного ключа в списке аргументов - PullRequest
0 голосов
/ 26 сентября 2018

У меня есть функция, которая выполняет итерацию по списку диктов, возвращая указанные пары ключ-значение в новый список диктов:

data = [
    {'user': {'login': 'foo1', 'id': 'bar2'}, 'body': 'Im not sure', 'other_field': 'value'},
    {'user': {'login': 'foo2', 'id': 'bar3'}, 'body': 'Im still not sure', 'other_field': 'value'},
]

filtered_list = []
keys = ['user','body']

for i in data:
    filt_dict = dict((k, i[k]) for k in keys if k in i)
    filtered_list.append(filt_dict)

Ключ user содержит вложенный ключ с именем login;как это можно добавить в список аргументов ключей вместо ключа user?

Пример вывода:

filtered_list = [
    {'login': 'foo1', 'body': 'Im not sure'},
    {'login': 'foo2', 'body': 'Im still not sure'},
]

Ответы [ 2 ]

0 голосов
/ 26 сентября 2018

Если вы уверены, что все элементы (дикты) в списке будут иметь указанные вами ключи, то быстрое решение может быть следующим:

filtered_list = [
    {
        'login': elem['user']['login'],
        'body': elem['body'],
    }
    for elem in data]

В нем нет обработки ошибок для пропущенных ключей.

0 голосов
/ 26 сентября 2018

Как насчет этого?Предполагается, что ваша цепочка ключей действительно существует в итерациях, которые вы повторяете.

Настройка

>>> from functools import reduce
>>> data = [{'user': {'login': 'foo1', 'id': 'bar2'}, 'body': 'Im not sure', 'other_field': 'value'},
...         {'user': {'login': 'foo2', 'id': 'bar3'}, 'body': 'Im still not sure', 'other_field': 'value'}]
>>> keys = [('user', 'login'), ('body',)]

Решение

>>> [{ks[-1]: reduce(dict.get, ks, d) for ks in keys} for d in data]
[{'body': 'Im not sure', 'login': 'foo1'}, {'body': 'Im still not sure', 'login': 'foo2'}]
...