我有一个可能包含数字的字符串列表。我想按字母顺序对此列表进行排序,但每次字符串包含数字时,我都希望它按值排序。例如,如果列表是
['a1a','b1a','a10a','a5b','a2a'], 排序后的列表应该是
['a1a','a2a','a5b','a10a','b1a']一般来说,我希望将字符串中的每个数字(一个数字序列)视为一个特殊字符,它比任何字母都小,并且可以在数字上与其他数字进行比较。
有没有什么python函数可以简洁地做到这一点呢?
发布于 2021-06-10 18:21:44
您可以使用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())当然也会给出相同的输出。
https://stackoverflow.com/questions/67918688
复制相似问题