不改变绝对值的情况下按绝对值排序

18
我想使用 abs() 对元组进行排序,而不实际改变元组中的元素为正值。
def sorting(numbers_array):
    return sorted(numbers_array, key = abs(numbers_array))


sorting((-20, -5, 10, 15))

根据 Python 维基百科(https://wiki.python.org/moin/HowTo/Sorting/#Key_Functions),sorted(list, key=) 函数应该使用参数 key 进行排序,而不会实际改变列表的元素。然而,abs() 只接受 int(),我还没有想出把那个元组转换成 int 的方法,如果需要的话。

等等,你在这里尝试对一个元组进行排序,而不是列表。这是有意为之吗? - BlackVegetable
2
sorted((-20, -5, 10, 15), key=lambda v: -v if v<0 else v) 是一个替代更正确的 sorted((-20, -5, 10, 15), key=abs) 的方法。 - dawg
3个回答

26

您需要为 key 提供一个 可调用对象,即一个函数或类似的内容;在对序列进行排序时,它将被针对每个元素进行调用。 abs 可以是这个可调用对象:

sorted(numbers_array, key=abs)
你相反地传递了abs()调用的result,这确实不能处理整个列表。
演示:
>>> def sorting(numbers_array):
...     return sorted(numbers_array, key=abs)
... 
>>> sorting((-20, -5, 10, 15))
[-5, 10, 15, -20]

我没有复制粘贴你的答案。当你回答时,我正在打字 ;) - ProgrammingIsAwsome
1
@ProgrammingIsAwsome:我并不认为你这样做了 :-) 首先,我使用了PEP-8间距来处理关键字参数,而你没有。 - Martijn Pieters
@MartijnPieters:刚刚谷歌了PEP-8,有很多代码规范。 - ProgrammingIsAwsome
我刚刚在另一个网站上尝试了这个,但它不起作用,而在pythontutor上却可以。我得到的错误是sorting()收到了一个意外的关键字参数'key'。 - Nick Kremer
@NickKremer:啊,sorting()不是sorted()函数。你的错误信息告诉你那里调用了错误的函数。 - Martijn Pieters
我明白了。我的代码有错误,现在它已经可以工作了。我试图调用函数'sorting()'而不是'sorted()'。 - Nick Kremer

1
如果你想排序这4个值(-20, -5, 10, 15),期望的输出结果是:[-5, 10, 15, -20],因为你需要取绝对值。
以下是解决方案:
def sorting(numbers_array):
    return sorted(numbers_array, key = abs)


print(sorting((-20, -5, 10, 15)))

@MartijnPieters:已编辑。我仍在使用Python 2.7,因为3.x还不支持所有功能。但是我相信你比我更了解这方面的知识。 - ProgrammingIsAwsome

0
lst = [-1, 1, -2, 20, -30, 10]
>>>print(sorted(lst, key=abs))
>>>[-1, 1, -2, 10, 20, -30]

1
你能否提供一些解释来说明你的答案是如何解决这个问题的?这有助于未来搜索相同问题的用户。 - Chrismas007

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接