2012-04-23 72 views
1

我想基於列表中的數字與給定數字的接近程度對列表進行排序。 因此,例如:相對於列表中最接近的數字對列表進行排序python

target_list = [1,2,8,20] 
number = 4 

then probably sorted list is [2,1,8,20] 
     as 4-2 = 2 
      4-1 = 3 
      mod|4-8| = 4 
      mod|4-20| = 16 

櫃面碰撞,我真的不關心哪一個是第一位的,但然後我試圖解決這距離度量的基礎上的列表。 什麼是最好的(和pythonic)方式來做到這一點。

感謝

回答

10

可以使用sorted功能

>>> target_list = [1,2,8,20] 
>>> sorted(target_list, key=lambda x: abs(4-x)) 
[2, 1, 8, 20] 

或者,如果你想在適當的位置進行排序,甚至列表sort方法接受keykey參數。

>>> target_list.sort(key=lambda x: abs(4-x)) 
>>> target_list 
[2, 1, 8, 20] 
+0

拉姆達我的錯誤。任何人都有一個不錯的oneline解決方案? 'sorted(target_list,key = partial(operator.add,-number))'顯然錯過了'abs()':( – ch3ka 2012-04-23 19:54:43

+0

@ ch3ka可以通過使用['functional'模塊](http:// docs。 python.org/release/3.1.5/howto/functional.html#the-functional-module)通過編寫'operator.add'和'abs'。 – ovgolovin 2012-04-23 22:22:37

+0

@ ch3ka但是我認爲'lambda'會更好看!Raymond Hettinger最近寫了關於所有那些'partial's:https://twitter.com/#!/raymondh/status/183686911112646657 – ovgolovin 2012-04-23 22:26:08

4
sorted(target_list, key=lambda k: abs(k - 4)) 

或者到位排序列表:

target_list.sort(key=lambda k: abs(k - 4)) 
1
>>> target_list.sort(key=lambda x: abs(number-x)) 
>>> target_list 
[2, 1, 8, 20] 
相關問題