2011-07-01 14 views
4

の対応を維持しながら、テーブルの列(リストのリスト)をソート:は、例えば行

list1 = ['c', 'b', 'a'] 
list2 = [3, 2, 1] 
list3 = ['11', '10', '01'] 
table = [list1, list2, list3] 

私は最初の列(リスト1)に関してソートしたいのですが、私は思います最後の注文のように、まだ線を保存しています(ソート後にはまだ 'b'、2、 '10'の線があります)。この例では、個々のリストを個別に並べ替えることができますが、私のデータではそれだけではできません。 pythonicアプローチとは何ですか?

答えて

6

一つの簡単な方法は、zipを使用することです:

>>> from operator import itemgetter 
>>> transpose = zip(*table) 
>>> transpose.sort(key=itemgetter(0)) 
>>> table = zip(*transpose) 
>>> table 
[('a', 'b', 'c'), (1, 2, 3), ('01', '10', '11')] 
+2

[FMc]で少し修正する(http://stackoverflow.com/questions/6542399/sorting-columns-in-a-table-list-of-lists-whilst-preserving-the-correspondence-o/6542819) #6542819)の 'sorted'の使い方は、上記の1行です:' table = zip(* sorted(zip(* table)、key = itemgetter(0))) ' – senderle

1
# Get a list of indexes (js), sorted by the values in list1. 
js = [t[1] for t in sorted((v,i) for i,v in enumerate(list1))] 

# Use those indexes to build your new table. 
sorted_table = [[row[j] for j in js] for row in table] 

は、Pythonはタプルのリストをソートする方法についてはthis questionを参照してください。