【问题标题】:Sort list of lists containing dictionaries in Python在 Python 中对包含字典的列表进行排序
【发布时间】:2019-05-07 22:37:41
【问题描述】:

我正在尝试实施遗传算法来优化路径。为此,我需要对列表进行排序。

基本列表 (list_cities) 如下所示:

[[{'city': 'Pau', 'lan': 43.293295, 'lng': -0.36357}, {'city': 'Marseille', 'lan': 43.293551, 'lng': 5.377397}, {'distance': 5572.500801706894}], [{'city': 'Nice', 'lan': 43.70168, 'lng': 7.260711}, {'city': 'Lyon', 'lan': 45.759132, 'lng': 4.834604}, {'distance': 6306.2650380290725}]]

如您所见,我有一个全局列表,其中包含多个列表(200 个),其中包含城市本身和距离(表示按列表顺序链接所有城市的总距离。 我想按距离的最后一个值对我的 200 个城市列表进行排序。 我尝试了很多方法,但都没有成功。

我的最后一次尝试:

sort_list = sorted(list_cities, key=lambda k: k['distance'])

这给了我以下结果:

TypeError: 列表索引必须是整数或切片,而不是 str

【问题讨论】:

  • 看起来您的列表列表不是字典列表,请尝试制作字典列表并执行您已经做过的操作。
  • 有没有办法按照我想要的方式排序?
  • 嗯,也许有一些额外的步骤,我会为你写一个解决方案。
  • 如果距离对象总是你列表中的最后一个,你可以试试k[-1]["distance"]
  • 确实,它总是我列表中的最后一个@tevemadar,您的解决方案似乎有效:) 无论如何,我想知道,这是一种像这样工作的好方法吗?!在第一次构建列表时,我是否需要考虑为其他人更改此列表的结构。最初的城市来自一个 json 文件,但也许我第一次构建的列表很糟糕?!

标签: python list sorting dictionary


【解决方案1】:

[[{},{}],[{},{}]] 是一个包含 objects dicts 的列表列表(我一直在这个答案的其余部分调用对象,因为数据无论如何都来自 JSON)。因此,为了按内部对象包含的数字对列表进行排序,您必须在列表中找到给定的对象,然后从中获取数字。
正如示例所示并且您的评论证实,距离始终位于您可以通过索引 -1 访问的最后一个元素中,因此

sort_list = sorted(list_cities, key=lambda k: k[-1]['distance'])

可以工作。

关于另一个问题:我觉得只将城市放在一个对象的列表中更自然:

[
 {
  'cities':[
   {'city':'Pau','lat':...,'lon':...},
   {<2nd city>},
   ...
   {<last city>}
  ],
  'distance':...
 },
 ...
]

那么它将与最初的尝试一起工作。
(对不起这个笨拙的例子,我是在触摸屏上输入的,呃)

【讨论】:

  • Np 时间,你帮了我很多!我会考虑根据您的建议改变结构。非常感谢!
  • " 是包含对象的列表的列表。" everything 在 Python 中是一个对象。列表是对象,int 是对象,类、函数,它们都是对象。来自 Javascript,您可能很想将 {} 称为“对象”,您在技术上是正确的,但完全模棱两可。那是dict。因此,OP 正在使用包含 dict 对象的列表对象的列表对象。
  • 感谢词源提示,我会更改标题以更精确
  • @juanpa.arrivillaga 谢谢,在开头加了几句。
猜你喜欢
  • 1970-01-01
  • 2015-08-24
  • 1970-01-01
  • 2021-09-24
  • 2011-03-14
  • 2021-04-26
  • 1970-01-01
  • 2021-10-31
  • 1970-01-01
相关资源
最近更新 更多