Python中的字母数字排序和负数

ThG*_*ThG 4 python sorting

我有一个相当简单的列表(一个数字后跟一个句子),这里按正确的顺序:

-347 a negative number
-100 another negative number
-25 and again, a negative number
17 some text
25 foo bar
100 two same texts
100 two same texts (almost)
350 a positive number
Run Code Online (Sandbox Code Playgroud)

每次添加新项目时,我都需要对该列表进行排序.

我搜索了SO,发现答案:

在python中排序 - 如何对包含字母数字值的列表进行排序?

我使用的代码是奇特的,它是:

import re
def convert(str):
    return int("".join(re.findall("\d*", str)))

list1.sort(key=convert)
Run Code Online (Sandbox Code Playgroud)

为了更好地解释我的问题,我洗了清单并运行了代码.

结果是:

17 some text
-25 and again, a negative number
25 foo bar
100 two same texts (almost)
100 two same texts
-100 another negative number
-347 a negative number
350 a positive number
Run Code Online (Sandbox Code Playgroud)

什么地方出了错 ?代码的精确度是什么,自然地排序负数?

Kea*_*nge 6

排序可以接受元组,因此首先按数字排序,然后按文本排序

list_text = """-347 a negative number
-100 another negative number
-25 and again, a negative number
17 some text
25 foo bar
100 two same texts
100 two same texts (almost)
350 a positive number"""

list1 = list_text.split("\n")

list1.sort(key=lambda x: (int(x.split()[0]), x.split(" ",1)))

print("\n".join(list1))
Run Code Online (Sandbox Code Playgroud)


Mur*_*nik 3

恕我直言,最简单的方法是将字符串拆分为单个单词,然后按转换为 的第一个单词进行排序int

list1.sort(key = lambda x : int(x.split(" ")[0]))
Run Code Online (Sandbox Code Playgroud)

编辑:
作为 Keatinge,上述解决方案无法正确处理以相同数字开头的两个字符串。使用整个字符串作为辅助搜索词应该可以解决此问题:

list1.sort(key = lambda x : (int(x.split(" ")[0]), x)
Run Code Online (Sandbox Code Playgroud)