2013-05-31 31 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