2012-08-27 98 views
0

我有一個多列數據表,每行都是唯一的,我想知道如何根據多列進行排序。如果按字母順序排列解決方案已經被描述爲here。但是,我不需要按字母排序,而是需要根據存儲在另一個列表中的自定義排序對每列進行排序。例如,如果我的表是多列表排序與每列的自定義排序

mytable = [ 
    ('A1', 'B1', 'C1'), 
    ('A1', 'B2', 'C2'), 
    ('A2', 'B2', 'C1'), 
    ('A2', 'B2', 'C2') 
] 

我可能想的第一列被排序[「A2」,「A1」],第二列被排序[「B1」,「B2」],和第三列將被命令['C2','C1']。正確的結果是

mytable = [ 
    ('A2', 'B2', 'C2'), 
    ('A2', 'B2', 'C1'), 
    ('A1', 'B1', 'C1'), 
    ('A1', 'B2', 'C2') 
] 

回答

1

這會做你要找什麼for:

orderings = (
    ('A2', 'A1'), 
    ('B1', 'B2'), 
    ('C2', 'C1') 
) 

orders = [dict([(v, i) for i, v in enumerate(o)]) for o in orderings] 

mytable.sort(key=lambda r: tuple(o[c] for c, o in zip(r, orders))) 

實際上,列可能不會全部排序,也可能按照除左右順序以外的優先級排序。這可以通過附加索引來解決,並相應地調整算法。

1

Python默認按字典順序排序元組。這意味着你所需要做的就是編寫一個重新返回元組的函數。示例代碼:

order_a = {"A1": 1, "A2": 0} 
order_b = {"B1": 0, "B2": 1} 
order_c = {"C1": 1, "C2": 0} 

def key(t): 
    return order_a[t[0]], order_b[t[1]], order_c[t[2]] 

mytable.sort(key=key) 

(我使用的字典而不是列表在這裏定義的順序,因爲這將導致大量套可能值的更好的性能。)

+0

請注意,這將不得不擴展到超過3列的表格 –

+0

@DavidRobinson:我決定專注於實際問題。當然,你需要循環或類似的東西來將其從3推廣到n,但這不是問題。 –

+1

我認爲從「A1」,「A2」等例子中可以清楚地看出,這不是實際的用例! –