2010-11-06 41 views
2

當我調試我在Python 2.5得出如下古怪了些不合邏輯的水煤漿排序()函數調用:Python的排序()鍵功能的怪事

>>> aa = [10, 5, 20] 
>>> sorted(range(len(aa))) 
[0, 1, 2] 
sorted(range(len(aa)), key=lambda a: aa[a]) 
[1, 0, 2] 
sorted(range(len(aa)), key=lambda a: -aa[a]) 
[2, 0, 1] 

前兩個電話按預期工作,但最後一個是imho只是錯了!它應該是:[1,2,0]。

後試圖來我來到這個問題的根源進一步的實驗(不使用拉姆達或者否定操作,不過它也同樣的問題):

>>> bb = [-10, -5, -20] 
>>> sorted([0, 1, 2], key=bb.__getitem__) 
[2, 0, 1] 

即使事情像以下不工作,並表明雙重否定的作品:

>>> bb = [-10, -5, -20] 
>>> def fun(i): 
... return bb[i] 
>>> sorted([0, 1, 2], key=fun) 
[2, 0, 1] 
>>> def fun2(i): 
...  return -bb[i] 
>>> sorted([0, 1, 2], key=fun2) 
[1, 0, 2] 

我是失去了我的頭腦或問題在哪裏?或者爲什麼Python 3.x沒有用於正常工作的參數cmp?(兼容性是我沒有使用它的原因)?

+2

爲什麼第三個結果是錯的?你排序的值是'[0,1,2]',鍵是'[-10,-5,-20]'。排序會導致'[-20,-10,-5]',這會給出值[[2,0,1]] ... – adw 2010-11-06 23:10:40

+0

哎呀,你沒事!我不知道爲什麼我這樣做應該返回類似於: >>> bb = [-1,-1,-1] >>> j = 0 >>> for i in sorted(range( len(aa)),key = lambda a:-aa [a]): ... bb [i] = j ... j + = 1 >>> bb [1,2,0] – gw0 2010-11-06 23:32:15

回答

8

由鍵函數返回的值充當要排序的值的代理。 所以,當你說

sorted(range(len(aa)), key=lambda a: -aa[a]) 

要排序range(len(aa)),即[0, 1, 2],但使用值 -aa[0], -aa[1], -aa[2]作爲代理值。

range(len(aa)) 0 1 2 <-- values 
aa[a]   10 5 20 
-aa[a]   -10 -5 -20 <-- proxy values 

由於-20,或-aa[2],是最小的代理值,其相關聯的值2 變爲在排序結果的第一個元素。

由於-10或-aa[0]是次最小,其關聯值0將成爲排序結果中的第二個元素。

最後-5或-aa[1]是最後一個值,所以1是排序結果中的最後一個數字。

因此,sorted(range(len(aa)), key=lambda a: -aa[a])等於[2, 0, 1]

Python給出的答案是正確的。

0

這對我來說很有意義

>>> bb = [-10, -5, -20] 
>>> sorted([0, 1, 2], key=bb.__getitem__) 
[2, 0, 1] ==> corresponds to bb.__getitem__ of [-20, -10, -5] 
+1

我從來沒有見過Python打印對應於[-20,-10,-5]的bb .__ getitem__' – 2014-01-28 12:55:06

+0

我也沒見過似乎說兩種語言的人:) 所以恢復脾氣暴躁的臉!) – 2014-02-12 15:01:27

1

最後一個是恕我直言只是錯誤!它應該是:[1,2,0]

在第二個示例中,密鑰爲lambda a: aa[a],它爲您提供按大小遞增順序排列的元素索引。

在最後一個例子中,密鑰是lambda a: -aa[a]。由於否定,這給你指數中的元素減少大小順序。

所以最後的結果應該是[2, 0, 1] - 這與[1, 0, 2]相反。

在這個例子中

>>> bb = [-10, -5, -20] 
>>> sorted([0, 1, 2], key=bb.__getitem__) 
[2, 0, 1] 

你要增加大小順序元素的索引 - [2, 0, 1]相當於[-20, -10, -5]

在上面的兩個示例中,您將再次獲取大小遞增([2, 0, 1])或遞減大小順序([1, 0, 2])中元素的索引。