在Python中,首先根据整数重新排列字符串,然后增加组的值 例如,考虑字符串 '3a+4+4c+3b’< /代码>。然后,使用一些正则表达式,将其拆分为['3a','1','4c','3b']我如何重新排列该列表,以便对其进行排序,使下面没有字母的数字先放入列表中,然后其余元素按数字/字母组合的递增值进行排序?例如,['3a','1','4c','3b']变为['1','3a','3b','4c']

在Python中,首先根据整数重新排列字符串,然后增加组的值 例如,考虑字符串 '3a+4+4c+3b’< /代码>。然后,使用一些正则表达式,将其拆分为['3a','1','4c','3b']我如何重新排列该列表,以便对其进行排序,使下面没有字母的数字先放入列表中,然后其余元素按数字/字母组合的递增值进行排序?例如,['3a','1','4c','3b']变为['1','3a','3b','4c'],python,regex,string,list,sorting,Python,Regex,String,List,Sorting,编辑: 因此,为了澄清,我确实使用了排序的,但是如果我使用它,例如,在2k+1-6j+9i上,它变成了['1','2k','6j','9i'],就像你可以看到的那样,它并没有按照字母值的增加顺序排序。我希望它改为['1'、'9i'、'6j'、'3k']您可以使用一个键来排序() 但请注意,如果字符串长度超过两个字符,它可能无法按预期的方式工作。您可以这样做: sorted([...], key=lambda x: (not x.isdigit(), x[-1], int(x[:-1]) if x

编辑:


因此,为了澄清,我确实使用了排序的
,但是如果我使用它,例如,在
2k+1-6j+9i
上,它变成了
['1','2k','6j','9i']
,就像你可以看到的那样,它并没有按照字母值的增加顺序排序。我希望它改为
['1'、'9i'、'6j'、'3k']

您可以使用一个键来排序()

但请注意,如果字符串长度超过两个字符,它可能无法按预期的方式工作。您可以这样做:

sorted([...], key=lambda x: (not x.isdigit(), x[-1], int(x[:-1]) if x[:-1] else int(x)))

使用一个键对其进行排序,该键返回一个
元组
,该元组包含第一优先级-元素是否为所有数字-后跟第二优先级-元素中的字母-后跟可能的第三优先级-元素中数字的整数值

def sorter(l):
    return sorted(l, key=lambda x: (not x.isdigit(),
                                    ''.join(filter(str.isalpha, x)),
                                    int(''.join(filter(str.isdigit, x)))))
结果:

>>> sorter(['3a','1','4c','3b'])
['1', '3a', '3b', '4c']
>>> sorter(['1231212', '1a'])
['1231212', '1a']
>>> sorter(['13a', '3a'])
['3a', '13a']

只需将
排序
适用于您的示例。你能给出一个更好的例子吗?
natsorted(s.split(+)
使用package.@zondo将对大于9的整数进行中断。我猜问题的目的是将
['3a'、'5'、'4c'、'2b']
排序为
['5'、'3a'、'2b'、'4c']
。也就是说,按字母后缀排序,而不是按整数值排序。@SebastianPaaskeTørholm是的,你是对的。
(len(x),x[:-1])
lambda
函数中实际做了什么?@R.Kap:我稍微修改了一下,但它返回了一个元组,说明字符串是否是数字,以及字符串的倒数。如果字符串是数字,则元组将是
(0,反转字符串)
,如果不是,则元组将是
(1,反转字符串)
。由于具有较低值的元组位于第一位,因此仅为数字的字符串将位于不为数字的字符串之前。使用反向字符串作为第二个参数会使最后一个字符字母比其他字符更重要。
>>> sorter(['3a','1','4c','3b'])
['1', '3a', '3b', '4c']
>>> sorter(['1231212', '1a'])
['1231212', '1a']
>>> sorter(['13a', '3a'])
['3a', '13a']