我正在尝试对列表进行排序,将所有0移到列表的末尾.示例:[0,1,0,2,3,0,4] - > [1,2,3,4,0,0,0]
我看到有人在一行编码
list.sort(cmp=lambda a,b:-1 if b==0 else 0)
但我不明白括号内的意思.
有谁能告诉我?谢谢.
根据正常比较对列表进行排序:
some_list.sort()
提供定制比较器:
some_list.sort(cmp=my_comparator)
一个lambda函数:
x = lambda a, b: a - b # is roughly the same as def x(a, b): return a - b
一个if-else表达式:
value = truthy_case if condition else otherwise # is roughly the same as if condition: value = truthy_case else: value = otherwise
list.sort(cmp=lambda a,b:-1 if b==0 else 0)
本身:现在,比较器中的条件是b==0
,如果是,则指示b
值是否大于a
(结果的符号为负),否则指示值比较相同(符号为零).
虽然Python的list.sort()
是稳定的,这个代码是没有理智的,因为比较需要测试a
,也不仅是b
.正确的实现将使用key
参数:
some_list.sort(key=lambda a: 0 if a == 0 else -1)
list.sort(cmp=...)
实施:如果你想使用list.sort(cmp=...)
(你没有)或者你只是好奇,这是一个理智的实现:
some_list.sort(cmp=lambda a, b: 0 if a == b else +1 if a == 0 else -1 if b == 0 else 0)
但请注意:
在Py3.0中,
cmp
参数被完全删除(作为简化和统一语言的更大努力的一部分,消除了丰富的比较和__cmp__
方法之间的冲突).
对列表进行排序O( log )
.我不知道对于这个简单的问题,代码运行得更快,但我不这么认为.的O()
溶液过滤:
new_list = [x for x in some_list if x != 0] new_list.extend([0] * (len(some_list) - len(new_list)))
不过,差异可能只对很长的列表有意义.