繁体   English   中英

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

[英]What is the best way to sort this list?

我有以下列表:

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'

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

亚历克斯

您可以尝试类似于这个答案:

>>> 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然后使用此整数对列表项进行排序。

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

更新的答案

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的旧答案 <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作者。

尝试这个:

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]))

DEMO:

>>> 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')]

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

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))]

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM