【问题标题】:How to sort nested dictionary inside a list?如何对列表中的嵌套字典进行排序?
【发布时间】:2018-05-18 14:00:13
【问题描述】:
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}}]

【问题讨论】:

  • 所以,是的,每个条目有 两个 Price,那么您想按什么排序...?
  • 排序列表的第一个值条目。所以你想要最低限度?
  • 是的,我想要最低价格值。

标签: python list sorting dictionary


【解决方案1】:

由于相当复杂的数据性质,您可以在 list comprehension(遍历所有国家):

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

资源

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

        你可以试试这个

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2022-01-27
          • 2019-02-08
          • 1970-01-01
          • 2021-03-08
          • 2020-04-29
          • 2016-10-17
          • 1970-01-01
          • 2021-10-27
          相关资源
          最近更新 更多