2009-11-05 36 views
9

我读过this post并且还没有结束为我工作。用可变数量的键排列多维列表

编辑:我所描述的功能就像是在Excel中的排序功能......如果这使得它更清楚

这里是我的情况,我有一个制表符分隔的文本文档。每行大约有125,000行和6列(列由制表符分隔)。我将文档分成了一个二维列表。

我想写一个通用函数来排序二维列表。基本上我想有一个功能,我可以通过大列表,并且我想列出一个或多个列的关键字。很显然,我想把第一个键传给主分类点,然后第二个键等等。

还困惑吗?

下面是我想要做的一个例子。

Joel 18 Orange 1 
Anna 17 Blue 2 
Ryan 18 Green 3 
Luke 16 Blue 1 
Katy 13 Pink 5 
Tyler 22 Blue 6 
Bob  22 Blue 10 
Garrett 24 Red 7 
Ryan 18 Green 8 
Leland 18 Yellow 9 

说我通过这个列表,我的神奇功能,像这样:

sortByColumn(bigList, 0) 

Anna 17 Blue 2 
Bob  22 Blue 10 
Garrett 24 Red 7 
Joel 18 Orange 1 
Katy 13 Pink 5 
Leland 18 Yellow 9 
Luke 16 Blue 1 
Ryan 18 Green 3 
Ryan 18 Green 8 
Tyler 22 Blue 6 

和...

sortByColumn(bigList, 2, 3) 

Luke 16 Blue 1 
Anna 17 Blue 2 
Tyler 22 Blue 6 
Bob  22 Blue 10 
Ryan 18 Green 3 
Ryan 18 Green 8 
Joel 18 Orange 1 
Katy 13 Pink 5 
Garrett 24 Red 7 
Leland 18 Yellow 9 

任何线索?

回答

11
import operator: 
def sortByColumn(bigList, *args) 
    bigList.sort(key=operator.itemgetter(*args)) # sorts the list in place 
+0

这很棒。我从来没有听说过itemgetter(或者attrgetter,我现在也可以看到)。 – 2009-11-05 22:04:35

+2

那是你的Guido时间机器。 http://catb.org/jargon/html/G/Guido.html – 2009-11-05 22:07:59

+0

这正是我要找的。非常感谢! – 2009-11-08 22:41:44

8

这将排序2列3:

a.sort(key=operator.itemgetter(2,3)) 
1

确保您已转换数字到整数,否则会按字母顺序排序,而不是数字

# Sort the list in place 
def sortByColumn(A,*args): 
    import operator 
    A.sort(key=operator.itemgetter(*args)) 
    return A 

# Leave the original list alone and return a new sorted one 
def sortByColumn(A,*args): 
    import opertator 
    return sorted(A,key=operator.itemgetter(*args)) 
2

这里的关键思想(双关意图)是使用返回元组的关键函数。 以下,关键功能是lambda x: (x[idx] for idx in args) x设置为等于aList的一个元素 - 也就是一行数据。它返回一个值的元组,而不仅仅是一个值。 sort()方法根据列表的第一个元素进行排序,然后与第二个元素断开连接,依此类推。请参阅http://wiki.python.org/moin/HowTo/Sorting#Sortingbykeys

#!/usr/bin/env python 
import csv 
def sortByColumn(aList,*args): 
    aList.sort(key=lambda x: (x[idx] for idx in args)) 
    return aList 

filename='file.txt' 
def convert_ints(astr): 
    try: 
     return int(astr) 
    except ValueError: 
     return astr  
biglist=[[convert_ints(elt) for elt in line] 
     for line in csv.reader(open(filename,'r'),delimiter='\t')] 

for row in sortByColumn(biglist,0): 
    print row 

for row in sortByColumn(biglist,2,3): 
    print row 
+1

这些数字必须转换为整数 – 2009-11-05 21:55:25

+0

好点,gnibbler。固定。 – unutbu 2009-11-05 22:11:43