Как отсортировать вложенный словарь внутри списка? - PullRequest
0 голосов
/ 18 мая 2018
data = [{'USA': [{'accommodations': '2 BR ','Price': 1245},
                 {'accommodations': '5 BR ','Price': 1045}]},
        {'Dubai': [{'accommodations': '2 BR | Sleeps 6','Price': 966},
                   {'accommodations': '5 BR | Sleeps 6','Price': 800}]}]

Я хочу отсортировать вышеуказанные данные на основе цены.

Я знаю, что должен сделать что-то подобное, но я запутался из-за вложенного словаря и списка.

 sorted(data, key=lambda k: k["Price"])

Кроме того, требуется только первая (т.е. минимальная) запись значения в отсортированном списке.

Ожидаемый результат:

data = [{'usa': {'accommodations': '5 BR ','Price': 1045}},
        {'Dubai':{'accommodations': '5 BR | Sleeps 6','Price': 800}}]

Ответы [ 4 ]

0 голосов
/ 18 мая 2018

Из-за довольно сложной природы данных, вы можете использовать вложение * dict (где для каждой страны сохраняется только самое низкое (исходя из его цены) размещение) внутри списка (который проходит по всем странам):

>>> [{k: min(v, key=lambda x: x["Price"]) for k, v in item.items()} for item in data]
[{'USA': {'accommodations': '5 BR ', 'Price': 1045}}, {'Dubai': {'accommodations': '5 BR | Sleeps 6', 'Price': 800}}]

Ресурсы :

0 голосов
/ 18 мая 2018

Вы можете использовать min:

data = [{'USA': [{'accommodations': '2 BR ','Price': 1245},
             {'accommodations': '5 BR ','Price': 1045}]},
    {'Dubai': [{'accommodations': '2 BR | Sleeps 6','Price': 966},
               {'accommodations': '5 BR | Sleeps 6','Price': 800}]}]
final_data = [{a:min(b, key=lambda x:x['Price']) for a, b in i.items()} for i in data]

Выход:

[{'Usa': {'accommodations': '5 BR ', 'Price': 1045}}, {'Dubai': {'accommodations': '5 BR | Sleeps 6', 'Price': 800}}]
0 голосов
/ 18 мая 2018

Вы можете попробовать это

filteredData = []
for records in data:
    for country, accommodations in records.items():
        accommodations = sorted(accommodations, key=lambda k: k["Price"])
        filteredData.append({country:accommodations[0]})
0 голосов
/ 18 мая 2018

Это один из способов использования списочных представлений.Поскольку в ваших словарях содержится по одному элементу, мы извлекаем первый ключ и первое значение.В качестве альтернативы вы можете использовать next(iter(d.keys())) / next(iter(d.values())).

from operator import itemgetter

# sort increasing by price
res = [{list(item.keys())[0]: sorted(list(item.values())[0], key=itemgetter('Price'))}
       for item in data]

# get lowest price
res = [{list(item.keys())[0]: min(list(item.values())[0], key=itemgetter('Price'))}
       for item in data]

print(res)

[{'USA': {'accommodations': '5 BR ', 'Price': 1045}},
 {'Dubai': {'accommodations': '5 BR | Sleeps 6', 'Price': 800}}]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...