2009-11-05 34 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