我有一个包含数字的字符串列表,但找不到一个好的方法对它们进行排序。 例如,我得到如下结果:
something1 something12 something17 something2 something25 something29
与sort()方法。
sort()
我知道我可能需要以某种方式提取数字,然后对列表进行排序,但我不知道如何以最简单的方式做到这一点。
要对包含数字的字符串列表进行自然排序(即确保”something2”排在”something12”之前),你可以使用一个自定义的排序键来提取字符串中的数字部分进行比较。下面是如何使用Python的sorted()函数或带有自定义键的sort()方法来实现:
sorted()
def natural_sort_key(s): # 使用正则表达式找出字符串中的所有数字,并将它们转换为整数进行比较 return [int(text) if text.isdigit() else text for text in re.split(r'(\d+)', s)] # 示例列表 strings = ["something1", "something12", "something17", "something2", "something25", "something29"] # 使用sorted()函数和自定义键进行排序 sorted_strings = sorted(strings, key=natural_sort_key) print(sorted_strings)
这将会得到期望的输出:
['something1', 'something2', 'something12', 'something17', 'something25', 'something29']
re.split(r'(\d+)', s): 这个正则表达式将字符串 s 拆分成一个子字符串列表,其中数字被作为单独的元素保留。例如,”something12” 将会被拆分为 ["something", "12", ""]。
re.split(r'(\d+)', s)
s
["something", "12", ""]
int(text) if text.isdigit() else text: 这一行将任何数字子字符串转换为整数,同时保留其他子字符串。这确保了数字按照整数而不是字符串进行比较,从而实现了正确的数字排序。
int(text) if text.isdigit() else text
通过这种方法,列表将按照嵌入数字的正确顺序进行排序。