首先根据整数重新排列Python中的字符串,然后增加组的值

时间:2016-03-30 21:27:50

标签: python regex string list sorting

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

修改

所以,只是为了澄清,我确实使用了sorted,但是如果我使用它,例如,2k+1-6j+9i,它变成了['1', '2k', '6j', '9i'],你可能看起来不是按字母值增加的顺序排序。我希望它改为['1','9i','6j','3k']

3 个答案:

答案 0 :(得分:1)

您可以使用sorted()的密钥:

>>> sorted(['3a','5','4c','2b'], key=lambda x: (not x.isdigit(), x[::-1]))
['5', '3a', '2b', '4c']

但请注意,如果您的字符串长度超过两个字符,它可能无法正常工作。你可能会这样做:

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

答案 1 :(得分:0)

使用返回包含第一优先级的tuple的密钥对其进行排序 - 元素是否不是所有数字 - 后跟第二优先级 - 元素中的字母 - 后跟可能的第三优先级 - 元素中数字的整数值。

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']

答案 2 :(得分:-1)

基于@zondo和@ TigerhawkT3的想法,以及''是最小字符串的事实:

lst = ['3a','1','4c','3b', '12312a', '12b', '4b', '3a']
lst = sorted(lst, key = lambda s: \
    ('', int(s)) if s[-1].isdigit() else (s[-1], int(s[:-1])))
print lst
# ['1', '3a', '3a', '12312a', '3b', '4b', '12b', '4c']