Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/348.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/3/wix/2.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
什么';在Python3中,编写比较器作为排序键的正确方法是什么?_Python_Sorting_Python 3.x - Fatal编程技术网

什么';在Python3中,编写比较器作为排序键的正确方法是什么?

什么';在Python3中,编写比较器作为排序键的正确方法是什么?,python,sorting,python-3.x,Python,Sorting,Python 3.x,在删除cmp参数后,我不确定如何在Python3中编写比较器。考虑到Python3中的以下代码,如何仅使用键重写比较器 import functools def my_cmp(x, y): return x*5-y*2 l = [50, 2, 1, 9] print(sorted(l, key=functools.cmp_to_key(my_cmp))) 谢谢。您提出的这个“比较”函数是不一致的:它应该提供一个明确的(确定的)顺序,这意味着,如果您更改列表中元素的顺序并运行排序,您

在删除cmp参数后,我不确定如何在Python3中编写比较器。考虑到Python3中的以下代码,如何仅使用键重写比较器

import functools

def my_cmp(x, y):
    return x*5-y*2

l = [50, 2, 1, 9]
print(sorted(l, key=functools.cmp_to_key(my_cmp)))
谢谢。

您提出的这个“比较”函数是不一致的:它应该提供一个明确的(确定的)顺序,这意味着,如果您更改列表中元素的顺序并运行
排序
,您应该会得到相同的结果

在您的情况下,元素的顺序会影响排序:

import functools

def my_cmp(x, y):
    return x*5-y*2


l = [50, 2, 1, 9]
print(sorted(l, key=functools.cmp_to_key(my_cmp))) # [2, 1, 9, 50]

l = [50, 1, 2, 9]
print(sorted(l, key=functools.cmp_to_key(my_cmp))) # [1, 2, 9, 50]
这意味着你的“比较”功能是不一致的。首先提供良好的排序功能,然后将其转换为
功能应该不会很困难


关于您在评论中提出的问题,
key
接受一个只接受一个参数的函数,并返回“它有多大”的“度量”。最简单的例子是比较数字,在这种情况下,关键函数可以是:
lambda x:x
。对于任何数字,lambda表达式都将返回自身,比较现在变得微不足道

修改您的示例:

def my_key(x):
    return x    

l = [50, 2, 1, 9]
print(sorted(l, key=my_key)) # [1, 2, 9, 50]
上述内容的较短版本为:

l = [50, 2, 1, 9]
print(sorted(l, key=lambda x: x)) # [1, 2, 9, 50]

预期产量是多少?你想按什么键对给定的列表排序?这是一个奇怪的比较器,它对
2,1
1,2
都是正的。您希望这两个数字如何排序?一般来说,
key
是一个接受一个参数而不是两个参数的函数。例如,
key=len
key=lambda x:x[0]='e'
。预期的输出是[2,1,9,50],在Python 3下可以正常工作。奇怪的比较器不是重点,只是为了演示。我想知道如何将2个参数与Python v3中的Key in.sort()函数调用进行比较。如果
Key
只接受1个参数,我如何提供2个参数进行比较?这里的“sorting”函数与此无关。这只是为了演示,很可能是(x*3.14+y*2.71)。我只是想知道用Python3编写一个可以比较2个值的“cmp”函数的正确方法是什么。这并不令人困惑,Python排序是有限的,因此很糟糕。对无法“测量”的值进行排序并没有错,这些值只有在与另一个值进行比较时才具有顺序。说任何人都想做的唯一排序类型是由具有确定性适应度值的对象完成是愚蠢的。对这个问题的一个更好的回答是,python不支持您正在尝试做的事情;你有一个对象,有4个变量。3是整数,调用它们(范围、类型、状态),最后一个变量是名称、字符串。按照作用域组、类型、状态和字母顺序排序没有什么错。这可以用cmp清楚地书写和维护。然而,一个密钥需要破解,或者需要多个级别的数组/散列来完成。我的钥匙没有问题,我在移除cmp时遇到了一个大问题。我很欣赏你的拙见,但钥匙是有限的,不是健康的。@LukeDupin钥匙一点也不有限!的确,key并没有让你的生活变得更容易——我从来没有说过,我写的是它迫使你写更好的代码,因为它迫使你仔细思考顺序。问题中的例子最好地说明了这一点——它看起来可能是正确的,但OP遇到了不确定性行为,因为它没有很好地定义线性排序。只有在损坏可能已经造成的情况下,cmp才会在运行时显示这种行为…@LukeDupin
key=lambda x:x.scope,x.type,x.status,x.name
它返回一个元组,其中字段按您希望排序的顺序排列,并在元组之间进行字母(字典)比较。不错吧?