python3对python2真特么不兼容
cmp不行
map不行
lambda不行
sort也不行:TypeError: sort() takes no positional arguments
python2原始代码:
negative_pair_sim.sort(lambda x, y: cmp(x[3], y[3]), reverse=True)
没有耐心的请直接看python3代码:4,解决(最终代码)
1, sort
Traceback (most recent call last):
File "test.py", line 222, in
negative_pair_sim.sort(lambda x, y: cmp(x[3], y[3]), reverse=True)
TypeError: sort() takes no positional arguments
python3中的sort传入参数需要指定为key。即sort函数要加key=
# 按照https://stackoverflow.com/questions/55344116/python-typeerror-sort-takes-no-positional-arguments
negative_pair_sim.sort(key=lambda x, y: cmp(x[3], y[3]), reverse=True)
2,cmp
NameError: name 'cmp' is not defined
原因:python3中没有cmp函数,
解决:按照官方说明手写一个
# 我见过的最好的百度知道回答:
# https://zhidao.baidu.com/question/377763967.html
def cmp_for_py3(a,b):
return (a>b)-(a
注意:网上到处回答的 operator.eq是不能替代cmp的。 operator.eq(a,b)相同返回Ture不同返回False。而python2中自带的cmp函数是相同返回0,a比b大返回1,b比a大返回-1。完全不同。
3,lambda
negative_pair_sim.sort(key=lambda x, y: cmp_for_py3(x[3], y[3]), reverse=True)
到此为止,还是不行:
TypeError: () missing 1 required positional argument: 'y'
用括号扩起
negative_pair_sim.sort(key=lambda (x, y): cmp_for_py3(x[3], y[3]), reverse=True)
也不对!
lambda (x, y): cmp_for_py3(x[3], y[3]):
^
SyntaxError: invalid syntax
原因:python3不允许lambda中输入参数这么解包!要先封装好再传入https://stackoverflow.com/questions/15712210/python-3-2-lambda-syntax-error
4,解决(最终代码)
def cmp_for_py3(a,b):
return (a>b)-(a
# xy = (x,y)
negative_pair_sim.sort(key=lambda xy: cmp_for_py3(xy[0][3], xy[1][3]), reverse=True)
https://www.cnblogs.com/jpr-ok/p/9166337.html