我有以下列表:
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'
感谢您的帮助,并且如果您认为可以改进/澄清问题,请一如既往地发表评论。
亚历
答案 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包(版本> = 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))]