【问题标题】:Pythonic way to sort a nested list with keys使用键对嵌套列表进行排序的 Pythonic 方法
【发布时间】:2023-03-19 15:55:02
【问题描述】:

我有一个清单如下:

[{"1": {"movie": "0.53"}}, {"2": {"movie": "5.2"}}, {"3": {"movie": "3.2"}}]

我知道怎么做t = sorted(new_list, key=lambda i: float(i['1']['movie']), reverse=True)

但我不确定如何将123 作为迭代 ^

【问题讨论】:

  • 所以你问如何通过每个字典的单个key 对字典列表进行排序?
  • 是的,我想根据电影@mapf 进行排序
  • 这些字典的键是连续的ints吗?
  • 数据结构不正确。
  • 我认为OP的意思是[{"1": {"movie": "0.53"}}, {"2": {"movie": "5.2"}}, {"3": {"movie": "3.2"}}]

标签: python python-3.x list dictionary lambda


【解决方案1】:

您可以做的是将内部字典从dict.values() 转换为列表,选择第一个值,然后访问"movie" 键。然后将此作为float 传递给sorted 的关键函数:

l = [{"1": {"movie": "0.53"}}, {"2": {"movie": "5.2"}}, {"3": {"movie": "3.2"}}]

result = sorted(l, key=lambda x: float(list(x.values())[0]["movie"]))

print(result)

另一种选择是将您的字典列表转换为列表列表,从结果列表dict.items() 中对结果进行排序,然后将结果转换回字典列表:

l = [{"1": {"movie": "0.53"}}, {"2": {"movie": "5.2"}}, {"3": {"movie": "3.2"}}]

result = [
    dict(l)
    for l in sorted((list(d.items()) for d in l), key=lambda x: float(x[0][1]["movie"]))
]

print(result)

这也可以在排序前使用基本的dict.update 方法将字典列表转换为嵌套字典:

l = [{"1": {"movie": "0.53"}}, {"2": {"movie": "5.2"}}, {"3": {"movie": "3.2"}}]

dicts = {}
for d in l:
    dicts.update(d)
# {'1': {'movie': '0.53'}, '2': {'movie': '5.2'}, '3': {'movie': '3.2'}}

result = [{k: v} for k, v in sorted(dicts.items(), key=lambda x: float(x[1]["movie"]))]

print(result)

或者如果我们想在一行中完成,我们可以使用collections.ChainMap

from collections import ChainMap

l = [{"1": {"movie": "0.53"}}, {"2": {"movie": "5.2"}}, {"3": {"movie": "3.2"}}]

result = [
    {k: v} for k, v in sorted(ChainMap(*l).items(), key=lambda x: float(x[1]["movie"]))
]

print(result)

输出:

[{'1': {'movie': '0.53'}}, {'3': {'movie': '3.2'}}, {'2': {'movie': '5.2'}}]

【讨论】:

    【解决方案2】:

    顺便说一句,您发布的列表在语法上不正确,假设它是字典列表。您可以按如下方式对其进行排序:

    new_list = [
        {"1":{"movie": "0.53"}},
        {"2":{"movie": "5.2"}}, 
        {"3":{"movie": "3.2"}}
        ]
    
    t = sorted(new_list, key=lambda x: float(list(x.items())[0][1]['movie']))
    

    输出:

    [{'1': {'movie': '0.53'}}, {'3': {'movie': '3.2'}}, {'2': {'movie': '5.2'}}]
    

    【讨论】:

      猜你喜欢
      • 2013-02-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多