如何在列表中对嵌套字典进行排序?

时间:2018-05-18 14:00:13

标签: python list sorting dictionary

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}]}]

我想在Price的基础上对上述数据进行排序。

我知道我必须做这样的事情,但我因为嵌套字典和列表而感到困惑。

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

此外,只需要排序列表的第一个(即最小)值条目。

预期产出:

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

4 个答案:

答案 0 :(得分:2)

由于数据性质相当复杂,您可以使用 dict comprehension (其中只保留每个国家/地区的最低价格(基于价格)),在列表理解< / em>(遍历所有国家/地区):

>>> [{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}}]

<强>资源

答案 1 :(得分:1)

这是使用列表推导的一种方式。由于您的词典每个都包含一个项目,因此我们提取第一个键和第一个值。或者,您可以使用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}}]

答案 2 :(得分:1)

您可以使用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}}]

答案 3 :(得分:1)

你可以试试这个

filteredData = []
for records in data:
    for country, accommodations in records.items():
        accommodations = sorted(accommodations, key=lambda k: k["Price"])
        filteredData.append({country:accommodations[0]})