例如,考虑字符串'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']
。
答案 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']