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笔记本中运行代码。
我认为我的实施与以下问题相同,但我的工作并不起作用。
按照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
答案 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
功能;没有必要进行迭代,您必须返回-1
,0
或1
来表示相对顺序(因此,如果仍然存在,则必须使用cmp(min(list1), min(list2))
内置cmp()
功能)。
但是,您可以对数据进行排序,而不使用 a(慢)cmp
函数。您需要做的就是在排序键中提取每个列表的两个值的min()
:
lines.sort(key=lambda l: min(l[0], l[2]))
答案 1 :(得分:1)