2012-04-23 73 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] 
相关问题