Python 使用子列表元素的一部分对列表列表进行排序

Python 使用子列表元素的一部分对列表列表进行排序,python,sorting,substring,Python,Sorting,Substring,我有一份清单。每个子列表中的第一个元素是染色体,例如'chr1','chr5','chr10','chrX'和'chrY'。我想按染色体数目,然后按X和Y对子列表进行排序 List.sort(key=lambda x: Set_Chr_Nr_(x[0])) 我使用的是下面的def,它接受染色体字符串,删除'chr',如果是数字,则将余数转换为int,如果是'X'或'Y',则对数字进行assign def Set_Chr_Nr_ (Chr): """ Sort by chromosome

我有一份清单。每个子列表中的第一个元素是染色体,例如'chr1','chr5','chr10','chrX'和'chrY'。我想按染色体数目,然后按X和Y对子列表进行排序

List.sort(key=lambda x: Set_Chr_Nr_(x[0]))
我使用的是下面的def,它接受染色体字符串,删除'chr',如果是数字,则将余数转换为int,如果是'X'或'Y',则对数字进行assign

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
里克

你可以试试

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
你可以试试

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


为什么不把那份列表也发出来呢。我分析了人类基因组,这些列表往往是巨大的:)@RickTearle发一部分。你可以发一小部分,因为我们需要一些样本输入。另外请注意-
CapWords
通常是为类名保留的,对于大多数使用Python的人来说,将其用于变量会使阅读变得困难。(因此,假设它们是类,甚至会以不同的方式突出显示它们)。为什么不发布列表呢。我分析了人类基因组,这些列表往往非常巨大:)@RickTearle发布其中的一部分。你可以发布其中的一小部分,因为我们需要一些示例输入。还要注意,您应该检查-
CapWords
通常是为类名保留的,而将其用于变量会使大多数使用Python的人很难阅读。(因此,假设它们是类,甚至会以不同的方式突出显示它们)。但是,我将向def传递一个列表,而不是一个包含染色体的字符串?因此,您建议我将列表传递给函数,提取列表中所需的元素,对其进行处理以提取染色体编号,然后返回?为什么这比仅仅将包含染色体的字符串传递给函数更有效?@RickTearle您想对列表进行排序,因此需要传递列表。你可以检查这个url,它告诉你python中排序的几种方法。看看你发布的页面,特别是第一个使用lambda的示例,似乎传递的不是列表,而是列表的一个元素。所以我认为你不必通过一份名单。我在列表的另一个元素上测试了这一点,它是纯数字的,lambda方法对列表进行了正确排序。@RickTearle我有点困惑,例如排序(a,key=lambda x:…),列表a传递给函数sorted,x传递给lambda。我不知道你的意思。但是我正在向def传递一个列表,而不是一个包含染色体的字符串?所以你建议我将列表传递给函数,提取列表中所需的元素,处理它以提取染色体编号,然后返回?为什么这比仅仅将包含染色体的字符串传递给函数更有效?@RickTearle您想对列表进行排序,因此需要传递列表。你可以检查这个url,它告诉你python中排序的几种方法。看看你发布的页面,特别是第一个使用lambda的示例,似乎传递的不是列表,而是列表的一个元素。所以我认为你不必通过一份名单。我在列表的另一个元素上测试了这一点,它是纯数字的,lambda方法对列表进行了正确排序。@RickTearle我有点困惑,例如排序(a,key=lambda x:…),列表a传递给函数sorted,x传递给lambda。我不知道你的存在意味着什么。