2

我有以下列表:

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

4 回答 4

8

您可以尝试类似于答案:

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

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

于 2013-07-12T22:12:06.657 回答
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 < 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作者。

于 2013-07-12T22:26:17.480 回答
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')]
于 2013-07-12T22:07:55.167 回答
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))]
于 2013-07-12T22:12:21.863 回答