2014-09-18 84 views
1

我正在通過一個Python包的代碼嘗試瞭解它在做什麼,以便我可以對其進行修改,但是我在一個步驟中感到困惑。Python-lambda比較函數在自定義訂單上進行比較

的代碼有行:

get_key = lambda r: (r.CHROM, r.POS) 

這是用來訂購基於r.CHROMr.POS(我覺得至少這就是它在做什麼)的列表。 鑑於我的具體情況,r.CHROMstr數據類型,其可以是來自1-22的任何數值,以及按照排序優先級的順序的字母字符X,YMT

問題是,當使用這個lambda函數進行排序時,它按照字母數字排序,並以1,10,11,12,13,14,15,16,17,18,19,2,20,21,22, ...的順序出現,這顯然不符合我的要求。

是否有可能修改此lambda函數以提供自定義比較優先級或層次結構,以便生成的列表以1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,X,Y,MT的形式出現?

任何指針將不勝感激!我在這裏不知所措。

+0

我猜你在結果列表中的'151,6'是一個錯字?你的意思是'15,16'? – Kevin 2014-09-18 17:25:52

+0

@凱文哎呀,是的。更正了,謝謝。 – Brett 2014-09-18 17:27:39

回答

3

的第一步是確保你正在排序r.CHROM爲整數,而不是字符串:

get_key = lambda r: (int(r.CHROM), r.POS) 

然而,當r.CHROM有三個非數值之一這顯然失敗。訣竅是將它們分別視爲23,24和25的「虛擬」整數值。

chrom_num_values = {'X': 23, 'Y': 24, 'MT': 25} 
get_key = lambda r: (chrom_num_values.get(r.CHROM) or int(r.CHROM), 
        r.POS) 
+1

這仍然會評估那些非數字值的int(r.CHROM)'(因此產生一個'ValueError')。 – 2014-09-18 17:35:18

+0

對。我們將利用'None'作爲一個False值來對待。 – chepner 2014-09-18 17:36:45

+0

適合我! +1。 – 2014-09-18 17:37:15