如何对字典中的数组排序?

0 投票
3 回答
744 浏览
提问于 2025-04-15 16:55

我现在正在用Python写一个程序,用来跟踪视频游戏的统计数据。下面是我用来记录分数的字典的一个例子:

ten = 1
sec = 9
fir = 10
thi5 = 6
sec5 = 8

games = {
        'adom': [ten+fir+sec+sec5, "Ancient Domain of Mysteries"],
        'nethack': [fir+fir+fir+sec+thi5, "Nethack"]
        }

现在,我的做法有点繁琐,写了一大堆嵌套的if语句,但我觉得这不是正确的做法。我想找个办法,通过数组来对字典进行排序,然后找出前十个分数,而不是在if语句里深挖。

所以,简单来说,我的问题是:你们有没有什么建议,可以让我这个过程变得简单一点,而不是复杂得要命?

===== 编辑 ====

ten+fir会产生数字。我想找个方法来对这些列表进行排序(我对专业术语不太了解),也就是根据数字来排序(基本上,数组前面数字最大的排在前面)。

这是我目前的做法的一个例子(不过还不完整,因为这实在太累了):示例嵌套(paste2)(我们试试这个?)

==== 第二次编辑 ====

如果有人没看到我下面的评论:

ten、fir等等,这些只是分数的变量。基本上,它是从一个前十名的列表转变成一个变量数字。ten = 1,nin = 2,fir = 10,fir5 = 10,sec5 = 8,sec = 9……所以:'adom': [ten+fir+sec+sec5, "Ancient Domain of Mysteries"] 实际上是:'adom': [1+10+9+8, "Ancient Domain of Mysteries"],最后看起来像:

'adom': [28, "Ancient Domain of Mysteries"]

所以,基本上,如果我从我的例子中选出“前两名”,结果会是:

((1)) Nethack (48)

((2)) ADOM (28)

我本来想写一个实际的数字,但我在考虑改动一些东西,所以数字可能会有点不同,我不想重新写一遍。

== 第三次(希望是最后一次)编辑 ==

修正了我最初的代码示例。

3 个回答

0

Wim的解决方案不错,但我觉得你可以更进一步,把这项工作交给数据库来处理,而不是依赖Python。Python和大多数数据库的配合都很好,而你正在探索的很多问题其实已经有现成的解决办法了。

举个例子,与你其担心把字典转换成其他数据类型以便正确排序相比,你可以直接获取每个相关条目的数据,这些数据已经根据你的查询条件预先排序好了。这样就不需要复杂的排序和重新排序了。

虽然字典看起来很诱人,因为它们给人一种可以根据属性访问数据的数据库能力的错觉,但我觉得在实际使用中它们还是有不少问题。我没有具体的数据可以给你,但根据我的个人经验,在Python中处理大量数据时,使用像MySQL这样的数据库会更快、更高效,无论是在代码上还是计算上。

我不太清楚你打算如何构建你的数据结构,但在添加数据的同时,使用数据库来改变数据结构也会简单得多。

2
import heapq

return heapq.nlargest(10, games.iteritems(), key=lambda k, v: v[0])

这是获取前十个键/值对的最直接方法,这些对是根据每个“值”列表的第一个项目进行排序的。如果你能更清楚地说明你想要什么样的输出(只是名字、名字/值对,或者其他什么?)以及排序的标准,这当然很容易调整。

3

这样做怎么样:

scores = games.items()
scores.sort(key = lambda key, value: value[0])
return scores[:10]

这个代码会返回数组中的前10个项目,并且是按照数组里的第一个项目进行排序的。不过我不太确定这是不是你想要的,如果你需要其他的东西,请更新一下问题(并修正示例链接)...

撰写回答