【问题标题】:Workaround for creating a sorted list of dictionaries, without the sorted() function创建字典排序列表的解决方法,没有 sorted() 函数
【发布时间】:2020-12-20 15:25:16
【问题描述】:

您显然无法不使用 sorted() 函数对字典进行排序。 那么,有没有解决方法呢? (我不使用 sorted() 函数的原因是这是针对特定学校项目的。)

在字典列表中,每个字典都包含“名称”、“价格”等键。

小例子词典列表:

games = [
    {"name":"counterstrike", "price":15, "rating":98},
    {"name":"teamfortress2", "price":0, "rating":95},
    {"name":"half-life", "price":9, "rating":99}
]

我需要对它进行排序,例如,最高价格,但仍然能够访问所有其他键/值。 我得到的最远的结果是它采用了所有名称,并使用归并排序对其进行了排序。但后来我只有它的“名称”,而不是“价格”等。

那么,我是否可以通过创建一个列表/元组或其他东西来按“价格”对字典进行排序,使用算法(快速排序?合并排序?)对其进行排序,然后将其作为现在的列表放回去排序字典?

【问题讨论】:

  • 排序功能要自己实现,游戏是字典列表
  • 正确,目前我正在使用归并排序。它有效,但我不知道也找不到如何将它与字典一起使用,这可能需要不同的方式,但我不知道。因此问题。
  • 字典列表是一种非常古怪的方式来存储具有相同键的项目集合。您实际上是在重新发明数据类。那么为什么不使用一个类,创建一个包含同一类的三个对象的列表,然后按所需的键对该列表进行排序呢?
  • 如果您已经实现了按名称排序,那么更改代码以便比较价格应该非常简单。不幸的是,你没有包含你的代码,所以实际上不可能指出需要更新的一两行代码,但我猜你可以从字面上做一个 find+replace ['name'] -> @987654323 @ 它会起作用的。
  • 我使用的字典的实际列表来自一个包含大约 27000 个 Steam 游戏的 json。 @Noah这是一个有趣的想法,但是我将如何从字典的json列表转到类? @ Samwise 当我说我按名称对其进行排序时,我的意思是我现在有一个包含名称的列表,但我仍然需要能够访问所有其他键,而不仅仅是名称。

标签: python sorting dictionary


【解决方案1】:

您可以使用所需的密钥和决胜局来装饰每个游戏,然后排序并最终取消装饰。

按名称排序:

decorated = [(g['name'], i, g) for i, g in enumerate(games)]
mysort(decorated)
games = [d[2] for d in decorated]

按价格排序(从高到低)

decorated = [(-g['price'], i, g) for i, g in enumerate(games)]
mysort(decorated)
games = [d[2] for d in decorated]

需要 tie-breaker 以避免比较字典,这是不允许的(会导致错误)。我使用原始索引作为决胜局,这使得排序更加稳定,无论排序算法如何。

【讨论】:

  • 您好,非常感谢您的帮助!这是我发现的第一种完全符合我需要的方法。再次感谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-06-17
  • 2021-05-15
  • 2015-05-22
  • 2012-11-26
  • 2013-08-18
  • 2022-01-18
  • 1970-01-01
相关资源
最近更新 更多