2013-05-31 64 views
1

因此,我有一個從excel電子表格中提取的二維數據,我目前正在根據具有關鍵性數據的列進行排序。如何在python中進行分層排序?

#rows contains my data that I'm sorting, it's a 2D array 
searchdict = dict(Critical=1, High=2, Medium=3, Low=4) 
rows.sort(key=lambda row: searchdict.get(row[11], 5)) 

我想基於另一列進行排序,如果它是該列領帶,任何人都知道如何處理呢?預先感謝您的幫助。

供參考:另一列包含數值數據

+0

http://stackoverflow.com/questions/1516249/ python-list-sorting-with-multiple-attributes-and-mixed-order – georg

回答

4

在密鑰中使用元組。這種方法通常被認爲比連續做兩種更「pythonic」。

key=lambda row: (searchdict.get(row[11], 5), row[other_column])) 
+0

OP說另一列是數字,所以不需要其他列調用'searchdict.get'。 (順便說一句:thg的答案也是不正確的,因爲如果你想做2種排序,你必須首先按*鍵和主鍵排序。) – Bakuriu

+1

糟糕,你是對的。而且thg的回答也是不正確的,因爲'sort()'通常返回'None'而不是有序列表(通常使用'sorted()')。 – JAB

+0

謝謝,那就是訣竅! – avorum

2

蟒排序是stable,所以可以多次通過(以相反的順序)進行排序中:

data.sort(key=second criteria) 
data.sort(key=first criteria) 

這是最簡單的選擇,也可以是快於生成合成密鑰。

+0

真正偉大的洞察力,從來沒有意識到這種內建'sort'方法 – qwwqwwq

0

使用一個元組從您的排序鍵函數返回:

rows.sort(key=lambda row: (searchdict.get(row[11], 5), row[17])) 

Python的排序以項目索引0比與索引1

1

最好的選擇是第一項使用python的元組排序鍵。

#rows contains my data that I'm sorting, it's a 2D array 
searchdict = dict(Critical=1, High=2, Medium=3, Low=4) 
rows.sort(key=lambda row: (searchdict.get(row[11], 5), searchdict.get(row[<secondary column index here>], 5))) 

這起關閉的事實,在一個元組中的最左邊的元素被認爲是比較過程中更顯著,顯示出在這裏:

>>> (6, 5) > (5, 6) 
True 
>>> (6, 5) > (6, 4) 
True 
>>> (6, 5) > (6, 6) 
False 
>>> (2, 1, 1) > (1, 1000, 1000) 
True