我正在逐步完成Python程序包的代码,试图理解它正在做什么,以便我可以修改它,但是我在一步上感到困惑。
代码有一行:
get_key = lambda r: (r.CHROM, r.POS)
用于根据r.CHROM
和r.POS
排序列表(我认为至少这是它正在做的事情)。
鉴于我的具体情况,r.CHROM
是一种str
数据类型,可以是1-22
中的任何数值,也可以是字母字符X
,Y
,和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
???
任何指针都将非常感谢!我在这里不知所措。
答案 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)