【问题标题】:How to sort a dict by a specific location in the list in its value?如何按其值列表中的特定位置对字典进行排序?
【发布时间】:2017-05-31 17:43:24
【问题描述】:

我有一本像这样的字典:

d1= {'a':[1, 5], 'b':[2, 23], 'c':[99,12]}

在字典有两个值的列表之前,我可以这样排序:

for key in sorted(mydict, key=mydict.get, reverse=True):
    print key.rstrip() + " : " + str(mydict[key])

这实际上仍然适用于列表中的 first 值,但它对第二个值没有任何作用:

c : [99, 12]
b : [2, 23]
a : [1, 5]

如何改为按列表中的第二个值排序?如果我这样选择,如何按第二个值然后按第一个值排序,反之亦然?

【问题讨论】:

  • 字典没有顺序:你不能对字典进行排序。您只能将其转换为列表。
  • 一个好的指南是Python: "Sorting HOW TO"
  • 您可以使用有序字典(来自“集合”)来确保键和值按某种顺序排列。否则不能保证订单被保留。
  • 当然,没关系。为了对字典进行排序,我实际上必须将其转换为列表并在那里进行排序。这就是我用来排序的代码吗?

标签: python list sorting dictionary key-value


【解决方案1】:

实际上它对第二个值做了一些事情:这个值被用作 tie-breaker,以防第一个值相等。

不过,您可以简单地将lambda 表达式用作key

对于排序中的键(mydict, key=lambda x: (mydict.get(x)[1],mydict.get(x)[0]), reverse=真的): 打印 key.rstrip() + " : " + str(mydict[key])

这里发生的事情是你将如何对值进行排序作为“关键”,通过调用mydict.get(x)获取值,现在你可以构造一个新的元组(mydict.get(x)[1],mydict.get(x)[0]),其中第二个元素放在第一个元素和第一个元素元素作为第二个。

由于元组按字典顺序排序,这意味着 Python 将首先在第一个元素上进行比较,如果出现平局,则在第二个元素上进行比较。现在,由于我们交换了位置,因此它将首先比较第二个,然后再比较第一个。

但是,正如@Jean-FrançoisFabre 所说,您可以使用[::-1]反转元组,保存.get 操作(结果看起来更优雅)所以:

对于排序中的键(mydict, key=lambda x: mydict.get(x)[::-1], reverse=True): 打印 key.rstrip() + " : " + str(mydict[key])

但是请注意,解决此问题的更优雅的方法是立即对键值元组进行排序:

for key,value in sorted(mydict.items(), key=lambda x:x[1][::-1],反向=真): 打印 key.rstrip() + " : " + str(值)

【讨论】:

  • 这里只按照第二个值排序,第一个值不考虑。
  • @Jean-FrançoisFabre:啊,我明白了,我错过了这一点。将更新答案。
  • 我认为key =lambda x: (x[1][1], x[1][0]) 会做到的。值得一提的是,有序容器按字典顺序进行比较
  • get(x)[::-1]
  • @Jean-FrançoisFabre:这实际上是一个不错的技巧。
【解决方案2】:

所以这个问题很老,但这可能会对某人有所帮助。免责声明:我不知道 python,所以我将用非常广泛的术语来描述它,它可能是可能的,也可能不是。我已经在 C# 中完成了这项工作。

如果您需要对物品进行一次分类,请使用 Willern 的最佳答案。如果您一直需要对它们进行排序,请继续阅读。

我发现创建一个将字典和列表混合在一起的新集合对象是最方便的。新的集合对象导出了列表将具有的所有方法,并通过向两个集合添加内容来处理添加等。构造函数使用 lambda 从值中获取键,以便可以填充字典。该集合还导出了字典用于读取的所有方法(但出于明显的原因,不用于写入),因此键查找速度很快。此外,还有一个 AddRange 方法,因此插入不会是 O(N^2)。 AddRange 只会将所有项目附加到列表中并调用排序。

如何排序的扩展应该是相当明显的。

【讨论】:

    猜你喜欢
    • 2010-09-09
    • 2011-02-22
    • 2019-09-20
    相关资源
    最近更新 更多