2010-09-10 72 views
1

名称|数字|数字|数字|数字 名称|数字|数字|数字|数字 名称|数字|数字|数字|数字Python中,排序

我如何排序这个列表需要我场( 2,3,4,5)? 对不起。

更新

输入:

str|10|20 
str|1|30 

分类由第一场(1,10):

str|1|30 
str|10|20 

分类由第二场(20,30):

str|10|20 
str|1|30 
+0

很难说出你在问什么。也许提供一个预期输出和你已经尝试过的代码的例子? – cobbal 2010-09-10 06:01:01

回答

1

假设你开始一个字符串列表,通过分割每行到一个列表启动:任何你想要的指数

data = [line.split('|') for line in input] 

然后排序:

sort_index = 1 
sorted_data = sorted(data, key=lambda line: int(line[sort_index])) 

Python sorting guide有很多更信息。

+0

Etaoin的解决方案更好。 – aaronasterling 2010-09-10 06:16:27

2

您可以对特定的进行排序,该键指示排序功能如何评估要排序的条目 - 也就是说,我们如何确定两个条目中的哪一个更大。在这种情况下,我们首先使用split(例如,"a|b|c".split("|")返回["a", "b", "c"])通过管道拆分每个字符串,然后抓取您想要的任何条目。

排序第一个“民”字段:

sorted(lines, key=(lambda line : line.split("|")[1]) 

其中lines是行的列表,你在问题中提到。要在不同的字段上排序,只需更改括号中的数字即可。

3

我会使用运算符模块函数“itemgetter”而不是lambda函数。这是更快,并允许多层次的排序。

from operator import itemgetter 

data = (line.split('|') for line in input.split('\n')) 
sort_index = 1 
sorted(data, key=itemgetter(sort_index)) 
+0

+1最佳解决方案imo。我只是将'sorted(...)'的结果存储在一个变量中,因为它没有排序(并且''data.sort()'就地排序'不可用于生成器)。但你可能是这个意思。 – 2010-09-10 07:56:40

+0

+1,并同意最后一行会更好:data.sort(key = ..)。此外,发布者的原始请求是针对sort_index =(1,2,3,4)的,这是使用Python的基于0的索引指定复合键的方式。 – 2010-09-10 11:13:18