python:无法使list.sort工作

python: Can't make list.sort to work

1
2
3
4
5
6
7
8
9
def sort_line(line1,line2):

    for x1,y1,x2,y2 in line1:
        mn1 = min(x1,x2)
    for x1,y1,x2,y2 in line2:
        mn2 = min(x1,x2)
    return mn1 < mn2

lines.sort(sort_line)

这里每行有4个int。根据我在python wiki中的理解,我需要在sort()函数中传递一个比较函数作为参数。但我得到以下错误,

1
2
3
4
5
6
7
8
<ipython-input-107-b0e2f3c756cf> in draw_lines(img, lines, color, thickness)
     69    """
     70
---> 71     lines.sort(sort_line)
     72
     73     for line in lines:

TypeError: an integer is required (got type function)

我尝试使用sorted(),但也无法使其工作。

Python和Python版本

Python 3.5.2 |Anaconda 4.2.0 (64-bit)| (default, Jul 5 2016,
11:41:13) [MSC v.1900 64 bit (AMD64)] on win32

我正在运行Jupyter笔记本中的代码。

我认为我的实现与下面的问题相同,但我的不起作用。

自定义python列表排序

在遵循Martijn的答案之后,我修改了我的代码

1
2
3
4
lineList = lines.tolist()  //lines is a numpy array so I converted it to list
print ('lineList: ',lineList)
lineList.sort(key=lambda l: min(l[0], l[2]))
lines = np.array(lineList)

给我以下错误

1
2
3
4
5
6
7
8
<ipython-input-115-06412e8f5aba> in <lambda>(l)
     72     lineList = lines.tolist()
     73     print ('lineList: ',lineList)
---> 74     lineList.sort(key=lambda l: min(l[0], l[1]))
     75     lines = np.array(lineList)
     76

IndexError: list index out of range


你犯了几个错误。您没有足够近地阅读文档;Python3中没有cmp函数选项。您还错误地实现了您的cmp函数,最后但不仅如此,您根本不需要使用cmp函数,您可以使用key函数提取正在排序的列表中两个精确值的最小值。

您需要密切注意您似乎正在阅读的部分,使用cmp参数的旧方法:

In Py3.0, the cmp parameter was removed entirely (as part of a larger effort to simplify and unify the language, eliminating the conflict between rich comparisons and the __cmp__ methods).

这里的错误消息有点混乱,但是list.sort()不接受位置参数。从list.sort()文件中:

sort(*, key=None, reverse=None)

*表示不接受位置参数,也没有cmp选项。

返回排序方式:

When porting code from Python 2.x to 3.x, the situation can arise when you have the user supplying a comparison function and you need to convert that to a key function. The following wrapper makes that easy to do:

1
def cmp_to_key(mycmp):

[...]

In Python 2.7, the cmp_to_key() tool was added to the functools module.

同样,从list.sort()文件中:

The functools.cmp_to_key() utility is available to convert a 2.x style cmp function to a key function.

您还错误地实现了您的cmp函数;不需要迭代,您必须返回-101以指示相对顺序(因此,如果仍然有内置的cmp()函数,则必须使用cmp(min(list1), min(list2)))。

但是,您可以不使用(慢速)cmp函数对数据进行排序。您需要做的就是用排序键从每个列表的两个值中提取min()

1
lines.sort(key=lambda l: min(l[0], l[2]))


根据文件:

sort() accepts two arguments that can only be passed by keyword (keyword-only arguments): key and reverse.

cmp参数只存在于python 2中,通常被认为是不推荐使用的用法。