2009-11-05 8 views
9

私はthis postを読みましたが、私のために働いていません。多次元リストを可変数のキーで並べ替え

編集:私は記述していた機能だけでExcelのソート機能のようなものです...それはそれは

任意の明確ここに私の状況だ行う場合、私はタブ区切りのテキスト文書を持っています。 1行に約12万行と6列があります(列はタブ文字で区切られています)。ドキュメントを2次元のリストに分割しました。

2次元リストをソートするための汎用関数を作成しようとしています。基本的に私は大きなリストを渡すことができる機能を持ちたいと思います。そして、大きなリストを並べ替える1つ以上の列のキーです。明らかに、最初に渡されたキーを第1のソートポイント、次に第2のキーなどにしたいと思います。

まだ詰まっていますか?

ここに私がしたいことの例があります。

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 

どれ手がかり:

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 

は、私はそうのように、私の魔法のような関数にこのリストを渡されたと言いますか?

答えて

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

これはすばらしいことです。私はitemgetter(またはattrgetter、私も今見ている)について聞いたことがなかった。 –

+2

これは貴殿のタイムマシンです。 http://catb.org/jargon/html/G/Guido.html –

+0

これは私が探しているものです。どうもありがとう! –

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)) 
ます、あなたはint型に番号を変換していることを確認します
2

ここでの重要なアイデアは、タプルを返すキー関数を使用することです。 以下、キー機能はlambda x: (x[idx] for idx in args) xで、aListの要素、つまりデータの行と等しくなるように設定されています。 1つの値だけでなく、値の組を返します。 sort()メソッドは、リストの最初の要素に従ってソートし、2番目の要素との結び目を分割します(以下同様)。 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

数値をintに変換する必要があります –

+0

グッドポイント、gnibbler。一定。 – unutbu

関連する問題