Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/338.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/fsharp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 对字典列表排序时的默认键_Python_Sorting - Fatal编程技术网

Python 对字典列表排序时的默认键

Python 对字典列表排序时的默认键,python,sorting,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)时,

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

例如,给定一个列表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.\uu eq\uuu
),它的相等基础是一系列属性,其中一个或多个可能是字典列表。由于很难在字典中提供排序键,因为形成列表的字段可能事先不知道,因此我考虑完全跳过键的使用,以强制使用默认值。我的直觉是,
sorted
在没有键的情况下,无论原始顺序如何,对于复合类型都会产生相同的结果,但我还没有找到任何文档来支持这一点。有人能解释一下吗

编辑:我无法理解为什么将此标记为解决方案的副本?我想整理一份清单,而不是一本字典。我不在乎成分词典是如何排序的,但重要的是列表与列表比较中任何词典在列表中的位置。对于一个普通的列表,我可以使用
set(L1)==set(L2)
来比较内容,但是,我的目标是当内容是字典时尝试比较两个列表,这就是我需要对它们进行排序的原因。

使用
def\ucmp\uuuuuuuuuu(self,other)
作为比较器

根据定义,字典没有顺序。。。。因此,如果没有进一步的规范,排序行为是未定义的,您不能依赖任何东西…(实际上,鉴于OP的评论中存在潜在的重复目标,我有点收回这一点…我仍然说,如果不明确告诉字典您希望如何排序,您不应该对字典进行排序)


将按列表中的第一项排序。。。如果出现平局,它将按列表中的第二项排序,依此类推

感谢您尝试回答。请注意,我不是在对字典排序,而是在这里列出一个列表。我不明白为什么这是一个重复,因为你标记了这个重复解释了如何将一本字典与另一本字典进行比较。。。这个答案是解释列表如何排序的众多答案之一。。。。我还建议使用
def\uuu cmp\uuu
在自定义类上实现比较器(与
self.\uuu eq\uu
相反)。。。如果两个都没有回答您的问题,也许您可以尝试以某种方式重新设置问题的相位……我认为,问题后面添加的第一条注释解释了如何选择默认键:我想通过深入复合数据类型,可以尝试在未定义的dict上使用
\uu cmp\uu
。然而,我倾向于实现丰富的比较
\uuuu eq\uuu
,因为我只看到
=
的应用程序,而不是
=/code>或
当调用
排序(L)
时,
L
元素的排列顺序取决于
\uu cmp\uu
如何在它们上实现。在您的例子中,元素是dict,因此顺序取决于dict的行为。因此,问题以重复的形式结束。好的,谢谢你添加这个。我认为这会比标记为重复的问题有更好的答案。
sorted([(1,2,3),(4,5,6),(7,8)])