2014-09-18 90 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