我有一个可能包含数字的字符串列表。我想按字母顺序对这个列表进行排序,但是每次 String 包含一个数字时,我都希望它按值排序。 例如,如果列表是
['a1a','b1a','a10a','a5b','a2a'],
排序后的列表应该是
['a1a','a2a','a5b','a10a','b1a']
一般来说,我想把字符串中的每个数字(一个数字序列)当作一个特殊字符,它比任何字母都小,可以在数字上与其他数字进行比较。
是否有任何python函数可以紧凑地执行此操作?
答案 0 :(得分:1)
您可以使用 re
模块将每个字符串拆分为一个字符元组,并将数字分组为一个元素。类似 r'(\d+)|(.)'
的东西。这个正则表达式的好消息是它将分别返回数字组和非数字组。
作为一个简单的键,我们可以使用:
def key(x):
# the tuple comparison will ensure that numbers come before letters
return [(j, int(i)) if i != '' else (j, i)
for i, j in re.findall(r'(\d+)|(.)', x)]
演示:
lst = ['a1a', 'a2a', 'a5b', 'a10a', 'b1a', 'abc']
print(sorted(lst, key=key)
给出:
['a1a', 'a2a', 'a5b', 'a10a', 'abc', 'b1a']
如果你想要更高效的处理,我们可以在闭包中只编译一次正则表达式
def build_key():
rx = re.compile(r'(\d+)|(.)')
def key(x):
return [(j, int(i)) if i != '' else (j, i)
for i, j in rx.findall(x)]
return key
并以这种方式使用它:
sorted(lst, key=build_key())
当然给出相同的输出。