1

我有一个列表列表。每个子列表中的第一个元素是一条染色体,例如“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

瑞克

4

1 回答 1

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
于 2013-01-18T16:35:46.300 回答