按数字顺序对字符串进行排序

5

我想知道如何按内部数字排序字符串。

例如,我有以下字符串:

hello = " hola %d" % (number_from_database)
bye = "adios %d" % (number_from_database_again)

我希望按照数字大小对它们进行排序,即使数字发生改变也要排序。

1
你有需要排序的列表吗?按照什么进行排序? - Martijn Pieters
有时候用户在网页上输入"bye"比"hello"更早,所以hello = "hola 2",而bye = "adios 1"。有时候用户会先输入hello再输入bye,因此我想知道如何按照数字内部对它们进行排序,谢谢:D - Victor Castillo Torres
这并没有使事情更加清晰。排序适用于一系列项目;而你只有两个变量,hellobye - Martijn Pieters
这被称为“自然”排序,请参见https://dev59.com/2GXWa4cB1Zd3GeqPLEXh以及其中的链接以获取示例。 - georg
4个回答

13

您可以传递一个键来进行排序:

sorted(l, key=lambda x: int(re.sub('\D', '', x)))

例如:

In [1]: import re

In [2]: l = ['asdas2', 'asdas1', 'asds3ssd']

In [3]: sorted(l, key=lambda x: int(re.sub('\D', '', x)))
Out[3]: ['asdas1', 'asdas2', 'asds3ssd']

re.sub('\D', '', x)替换除了数字以外的所有内容


哥们儿,你就像一个工作中的神一样,谢谢你的回答,我不知道该怎么感谢你。愿上帝保佑你。 - Victor Castillo Torres
但是我只有14个声望,无法点赞,因为需要15个声望,当我拥有15个声望时,我会点赞的。 - Victor Castillo Torres

1

这是对安迪答案的补充。

如果您想排序包含字符串但没有任何数字的集合:

sorted(l, key=lambda x: int('0'+re.sub('\D', '', x)))

这将把那些没有任何数字的字符串放在最前面。


0

上述解决方案对于具有以下格式的字符串无效:

test 8 - test 18

以下代码将返回818而不是8
x = 'test 8 - test 18'
res = int(re.sub(r'\D', '', x))
print(res)

>>> 818

解决方法是执行搜索并获取结果:

x = 'test 8 - test 18'
res = int(re.search(r'\d+', x).group())
print(res)

>>> 8

所以,带有这个更正的最终解决方案是:

l = [
   'test 9 - test 8',
   'test 8 - test 18'
]

l2 = sorted(l, key=lambda x: int(re.search(r'\d+', x).group()))

print(l)
print(l2)

>>> ['test 9 - test 8', 'test 8 - test 18']
['test 8 - test 18', 'test 9 - test 8']

-1
salutations = [hello, bye]
salutations.sort(key=lambda x: int(filter(lambda s: s.isdigit(), x.split())[0]))

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接