python:无法使list.sort工作

时间:2016-12-04 10:45:52

标签: python python-3.x sorting python-3.5

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()函数中传递compare函数作为参数。但我收到以下错误,

<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和anaconda版

  

Python 3.5.2 | Anaconda 4.2.0(64位)| (默认,2016年7月5日,   11:41:13)[MSC v.1900 64 bit(AMD64)]在win32上

我在jupyter笔记本中运行代码。

我认为我的实施与以下问题相同,但我的工作并不起作用。

Custom Python list sorting

按照Martijn的回答后,我将代码修改为

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)

给我以下错误

<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

2 个答案:

答案 0 :(得分:2)

你犯了几个错误。你没有足够近地阅读文档; {3}} cmp函数选项在Python 3中消失了。您还错误地实现了cmp函数,最后但并非最不重要的是,您根本不需要使用cmp函数,您可以使用key function提取要排序的列表中两个确切值中的最小值。

您需要密切关注您正在阅读的部分The Old Way Using the cmp Parameter

  

在Py3.0中,cmp参数被完全删除(作为简化和统一语言的更大努力的一部分,消除了丰富的比较和__cmp__方法之间的冲突)。

此处的错误消息有点令人困惑,但list.sort()需要位置参数。来自list.sort() documentation

  

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

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

回到Sorting Howto:

  

将代码从Python 2.x移植到3.x时,如果用户提供比较功能并且需要将其转换为关键功能,则会出现这种情况。以下包装器使这很容易做到:

def cmp_to_key(mycmp):
     

[...]

     

在Python 2.7中,cmp_to_key()工具已添加到functools模块中。

再次来自list.sort()文档:

  

functools.cmp_to_key()实用程序可用于将2.x样式cmp函数转换为关键函数。

您也错误地实施了cmp功能;没有必要进行迭代,您必须返回-101来表示相对顺序(因此,如果仍然存在,则必须使用cmp(min(list1), min(list2))内置cmp()功能)。

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

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

答案 1 :(得分:1)

根据documentation

  

sort()接受两个只能通过关键字传递的参数(仅限关键字参数): key reverse

cmp 参数仅存在于Python 2中,通常被视为不推荐使用。