2010-01-31 42 views

回答

19

Python中,本身不具有 「2D陣列」 - 它具有(1d)的列表作爲內置插件,並且在標準庫模塊array(1D)陣列。有第三方庫,如numpy,它們提供Python可用的多維數組,但當然如果您使用其中一些第三方庫,那麼您會提到這樣的第三方庫,而不是僅僅說「在Python中」,?右 - )

所以我認爲通過「二維數組」你的意思名單,如名單:

lol = [ range(10), range(2, 12), range(5, 15) ] 

或類似物 - 即具有3個項目,每個列表項目是包含10個項目的列表,「第二行」將是子列表項目lol[1]。是的,很多假設,但你的問題是如此瘋狂地模糊,以至於無法避免做出假設 - 編輯你的Q以更精確地澄清,並且舉一個例子!如果你不喜歡試圖讀你的頭腦的人(可能失敗)因爲你目前無法避免。

所以在這些假設下,你可以排序每一個排序的第二個要求的順序3子列表,例如:

indices = range(10) 
indices.sort(key = lol[1].__getitem__) 
for i, sublist in enumerate(lol): 
    lol[i] = [sublist[j] for j in indices] 

這裏的一般做法是隻排序指標的範圍,然後使用適當排序的範圍重新排列所有的子列表。

如果你確實有不同的問題,當然會有不同的解決方案;-)。

+0

謝謝,你真的很好介意:)))),將來我會更具描述性和確定性。我的「真正的問題」是關於按照第二個 – user257522 2010-02-01 00:04:08

0

那麼,如果你在談論標準的Python列表,這很容易:mylist[1].sort()。例如:

>>> from random import randint 
>>> a_list = [[randint(1,15) for _ in range(10)] for _ in range(3)] 
>>> print a_list 
[[3, 12, 3, 12, 13, 5, 12, 2, 1, 13], [3, 8, 7, 4, 6, 11, 15, 12, 4, 6], [15, 3, 8, 15, 1, 6, 4, 7, 15, 14]] 
>>> a_list[1].sort() 
>>> print a_list 
[[3, 12, 3, 12, 13, 5, 12, 2, 1, 13], [3, 4, 4, 6, 6, 7, 8, 11, 12, 15], [15, 3, 8, 15, 1, 6, 4, 7, 15, 14]] 
26

「2D陣列」的外觀如何?

例如:

>>> a = [ 
    [12, 18, 6, 3], 
    [ 4, 3, 1, 2], 
    [15, 8, 9, 6] 
] 
>>> a.sort(key=lambda x: x[1]) 
>>> a 
[[4, 3, 1, 2], 
[15, 8, 9, 6], 
[12, 18, 6, 3]] 

但我猜你想是這樣的:

>>> a = [ 
    [12, 18, 6, 3], 
    [ 4, 3, 1, 2], 
    [15, 8, 9, 6] 
] 
>>> a = zip(*a) 
>>> a.sort(key=lambda x: x[1]) 
>>> a 
[(6, 1, 9), 
(3, 2, 6), 
(18, 3, 8), 
(12, 4, 15)] 
>>> a = zip(*a) 
>>> a 
[(6, 3, 18, 12), 
(1, 2, 3, 4), 
(9, 6, 8, 15) 
] 
+1

所需的順序排列子列表,考慮使用'itemgetter(1)'而不是'lambda' – 2010-02-01 03:38:52

6

而不是使用lambda x: x[1]可以使用operator.itemgetter爲重點,以排序或排序功能。 itemgetter(n)創建一個從列表中獲取第n個項目的函數。

>>> matrix = [ [4,5,6], [1,2,3], [7,0,9]] 
>>> from operator import itemgetter 
>>> sorted(matrix, key=itemgetter(1)) 
[[7, 0, 9], [1, 2, 3], [4, 5, 6]] 
0

這是一個小功能,我寫了這個目的:

def sorted_table(data, column=0, reverse=False): 
    return sorted(data, cmp=lambda a,b: cmp(a[column], b[column]), reverse=reverse) 

其實,我有更多的複雜的要求,這是由兩列對錶進行排序。事實證明,cmp()功能是相當通用的;這是我的原始功能:

def sort_report(data): 
    """Sort report columns: first by value, then by label.""" 
    return sorted(data, cmp=lambda a,b: cmp(b[2], a[2]) or cmp(a[0], b[0])) # label is column 0; value is column 2 

b和a在第一種情況下相反,因爲目標是將值從高到低排序。