排序词典列表时的默认键

时间:2015-06-10 05:12:28

标签: python sorting

在字典列表上排序时,可以通过指定一个或多个键来确保一致性和所需的排序顺序。

例如,给定一个列表L:

L = [{'a':1, 'b':2}, {'b':1, 'a':2}]
sorted(L, key=lambda dic:dic['a'])

返回

  

[{'a':1,'b':2},{'a':2,'b':1}]

同样,

sorted(L, key=lambda dic:dic['b'])

返回

  

[{'a':2,'b':1},{'a':1,'b':2}]

当没有提供密钥时,即只使用sorted(L)我正在观察与第一个排序表达式相同的排序顺序。 未提供时,如何选择密钥?

背景 我的最终目标是为自定义类编写一个通用比较器(self.__eq__),相等的基础将是一些属性,其中一个或多个属性可能是字典列表。由于很难提供排序键,因为字典中形成列表的字段可能事先不知道,我正在考虑完全跳过使用键来强制默认。我的直觉是,sorted在没有密钥的情况下,无论原始顺序如何,都会产生相同的复合类型结果,但我没有找到任何文档来支持这一点。有人可以解释一下吗?

修改:我无法理解为什么这被标记为explanation for dict.__cmp__解决方案的副本?我正在尝试排序列表,而不是字典。我不关心如何排序组成词典,但重要的是列表与列表比较列表中的任何词典的位置。使用普通列表可以set(L1)==set(L2)来比较内容,但是,我的目标是在内容是字典时尝试比较两个列表,这就是我需要对它们进行排序的原因。

1 个答案:

答案 0 :(得分:0)

使用def __cmp__(self,other)作为比较器。

字典按定义没有顺序....因此排序行为是未定义的,没有进一步的说明,你不能依赖任何东西......(实际上我有点收回这个,因为在OP的评论中潜在的欺骗目标。我仍然说你不应该在没有明确告诉你如何排序字典的情况下对字典进行排序。

sorted([(1,2,3),(4,5,6),(7,8)])

将对列表中的第一项进行排序...如果出现平局,它将对列表中的第二项进行排序,依此类推