排序此列表的最佳方法是什么?

时间:2013-07-12 22:06:08

标签: python list sorting sorted

我有以下列表:

my_list = ['name.13','name.1', 'name.2','name.4', 'name.32']

我希望对列表进行排序并按顺序打印出来,就像这样

name.1
name.2
name.4
name.13
name.32

到目前为止我尝试的是:

print sorted(my_list)

name.1
name.13
name.2
name.32
name.4

sorted()命令显然按字母顺序处理字符串。也许在首先检测到.之后进行数字排序会更好吗?

有没有一种好的方法可以正确排序?什么是最有效的方法?我如何应用这个是我有一个元组列表,并希望使用元组的第二个元素对它进行排序?例如:

tuple_list = [('i','name.2'),('t','name.13'),('s','name.32'),('l','name.1'),('s','name.4')]

print tuple_list
'l','name.1'
'i','name.2'
's','name.4'
't','name.13'
's','name.32'

感谢您的帮助,并且如果您认为可以改进/澄清问题,请一如既往地发表评论。

亚历

4 个答案:

答案 0 :(得分:8)

你可以尝试类似于this回答:

>>> my_list = ['name.13','name.1', 'name.2','name.4', 'name.32']
>>> sorted(my_list, key=lambda a: (int(a.split('.')[1])))
['name.1', 'name.2', 'name.4', 'name.13', 'name.32']

或者使用元组:

>>> tuple_list = [('i','name.2'),('t','name.13'),('s','name.32'),('l','name.1'),('s','name.4')]
>>> sorted(tuple_list, key=lambda (a,b): (int(b.split('.')[1])))
[('l', 'name.1'), ('i', 'name.2'), ('s', 'name.4'), ('t', 'name.13'), ('s', 'name.32')]

编辑以解释其作用:

该示例将lambda函数传递给sorted,该函数拆分字符串,然后将第二部分转换为整数。 sorted然后使用此整数对列表项进行排序。

此示例在排序时完全忽略点左侧的字符串。如果您还需要按第一部分排序,请告诉我。

答案 1 :(得分:4)

更新的答案

natsort版本4.0.0开始,这个开箱即用,无需指定任何选项:

>>> import natsort
>>> my_list = ['name.13','name.1', 'name.2','name.4', 'name.32']
>>> natsort.natsorted(my_list)
['name.1','name.2', 'name.4','name.13', 'name.32']

natsort< OLD ANSWER 4.0.0

如果您不反对外部包,请尝试natsort包(版本> = 3.0.0):

>>> import natsort
>>> my_list = ['name.13','name.1', 'name.2','name.4', 'name.32']
>>> natsort.natsorted(my_list, number_type=int)
['name.1','name.2', 'name.4','name.13', 'name.32']

在这种情况下,number_type参数是必需的,因为默认情况下natsort会查找浮点数,小数点会使所有这些数字都被解释为浮点数。


完全披露:我是natsort作者。

答案 2 :(得分:3)

试试这个:

sorted(my_list, key=lambda x: int(x.split('.')[1]))

演示:

>>> my_list = ['name.13','name.1', 'name.2','name.4', 'name.32']
>>> sorted(my_list, key=lambda x: int(x.split('.')[1]))
['name.1', 'name.2', 'name.4', 'name.13', 'name.32']
>>> 

将其扩展到元组,

sorted(tuple_list, key = lambda x: int(x[1].split('.')[1]))

样本:

>>> sorted(tuple_list, key = lambda x: int(x[1].split('.')[1]))
[('l', 'name.1'), ('i', 'name.2'), ('s', 'name.4'), ('t', 'name.13'), ('s', 'name.32')]

答案 3 :(得分:3)

这个使用更多内存,但不会多次拆分每个项目:

from operator import itemgetter
my_list = ['name.13','name.1', 'name.2','name.4', 'name.32']
my_nlist= [ (int(n.split('.')[1]), i) for i,n in enumerate(my_list)]
my_list = [ my_list[t[1]] for t in sorted(my_nlist, key=itemgetter(0))]

处理元组:

my_list = [('i','name.2'),('t','name.13'),
           ('s','name.32'),('l','name.1'),('s','name.4')]
my_nlist= [ (int(n[1].split('.')[1]), i) for i,n in enumerate(my_list)]
my_list = [ my_list[t[1]] for t in sorted(my_nlist, key=itemgetter(0))]