我有一份清单清单。每个子列表中的第一个元素是染色体,例如'chr1','chr5','chr10','chrX'和'chrY'。我想按染色体编号排序子列表,然后按X和Y排序。我尝试了以下内容。
List.sort(key=lambda x: Set_Chr_Nr_(x[0]))
我正在使用以下def,它接受染色体字符串,删除'chr',如果它是一个数字,则将余数转换为int,如果是'X'或'Y',则分配一个数字。
def Set_Chr_Nr_ (Chr):
""" Sort by chromosome """
if Chr:
New = Chr[3:]
if New == 'X': New = 23
elif New == 'Y': New = 24
elif New == 'M': New = 25
else: New = int(New)
else:
New = 0
return New
但它不会返回所需的排序顺序。相反,我得到一个列表,该列表以包含'chr1'的子列表开头,但放下包含'chr10'的子列表,而不是'chr2'。我在这里做错了什么?
包含列标题的示例数据:
Type OriginChr OriginBegin OriginEnd DestChr DestBegin DestEnd
inversion chr10 13105010 13105143 chr10 13104876 13105378
inversion chr14 87902496 87902539 chr14 87902497 87902540
瑞克
答案 0 :(得分:1)
你可以尝试,
a = ['chr1', 'chr10', 'chr5', 'chrX']
sorted(a, key=lambda x: Set_Chr_Nr_(x))
print a
如果要使用list.sort(),可以切换到
a.sort(lambda x,y: x-y, key=lambda x: Set_Chr_Nr_(x))
对于原始输入,如果列已修复,则可以使用
a = [['inversion', 'chr14', 87902496, 87902539, 'chr14', 87902497, 87902540], ['inversion', 'chr10', 13105010, 13105143, 'chr10', 13104876, 13105378]]
sorted(a, key=lambda x: Set_Chr_Nr_(x[1]))
print a