如何根据整数的绝对值对整数列表进行排序,以使正数获得更高的优先级 -
输入样本
lst = [1, -3, 3, -3, 12, 10]
Run Code Online (Sandbox Code Playgroud)
预期输出
[1, 3, -3, -3, 10, 12]
Run Code Online (Sandbox Code Playgroud)
我现在可以使用这样的代码来做到这一点,但我对0.1函数中的任意性感到困扰,并想知道是否有更干净的方法
我的代码
lst = [1, -3, 3, -3, 12, 10]
Run Code Online (Sandbox Code Playgroud)
另一个解决方案是使用元组作为排序键:
sorted(lst, key=lambda x: (abs(x), x < 0))
Run Code Online (Sandbox Code Playgroud)
为了更好地理解它:
1 ~ (1, False) ~ (1, 0)
-3 ~ (3, True) ~ (3, 1)
3 ~ (3, False) ~ (3, 0)
-3 ~ (3, True) ~ (3, 1)
12 ~ (12, False) ~ (12, 0)
10 ~ (10, False) ~ (10, 0)
Run Code Online (Sandbox Code Playgroud)
创建一个自定义比较器函数,它返回大小为 2 的元组。元组的第一个值用于绝对值,第二个值用于对具有相同绝对值的负值和正值进行排序。
sorted(lst, key=lambda x: (abs(x), -x))
# [1, 3, -3, -3, 10, 12]
Run Code Online (Sandbox Code Playgroud)
对于列表中的每个值,比较的值将是:
1 -> (1, -1)
3 -> (3, -3)
-3 -> (3, 3)
10 -> (10, -10)
12 -> (12, -12)
Run Code Online (Sandbox Code Playgroud)
这样,正值被推到每组的开头,负值被推到末尾。