Python - lambda比较器函数,用于在自定义顺序上进行比较

时间:2014-09-18 17:23:49

标签: python sorting lambda

我正在逐步完成Python程序包的代码,试图理解它正在做什么,以便我可以修改它,但是我在一步上感到困惑。

代码有一行:

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

用于根据r.CHROMr.POS排序列表(我认为至少这是它正在做的事情)。 鉴于我的具体情况,r.CHROM是一种str数据类型,可以是1-22中的任何数值,也可以是字母字符XY,和MT按排序优先顺序排列。

问题是当这个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 ???

任何指针都将非常感谢!我在这里不知所措。

1 个答案:

答案 0 :(得分: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)