对包含字符串和整数的列表进行排序 (Python)

gar*_*tor 2 python sorting list

我想对包含(字符串,整数,整数)的元组列表进行排序。这些元组的第一个值可以是任何字符串(例如“$”或“9”等数字字符串)。目标是根据这些元组的第一个元素进行排序,如果比较发生在两个相同的字符串之间,我将根据第二个元素进行排序。我尝试了以下方法,但结果并不成功。解决方案?

array = [('$', 0, 0), ('3', 3, 3), ('7', 5, 6), ('15', 6, 9), ('5', 7, 11), ('17', 8, 13), ('18', 9, 16), ('19', 10, 18), ('16', 11, 20)]
sorted_array = sorted(array, key=lambda x:(x[0], int(x[1])))
print(sorted_array)
Run Code Online (Sandbox Code Playgroud)

输出:

[('$', 0, 0), ('3', 3, 3), ('7', 5, 6), ('15', 6, 9), ('5', 7, 11), ('17', 8, 13), ('18', 9, 16), ('19', 10, 18), ('16', 11, 20)]
Run Code Online (Sandbox Code Playgroud)

我想得到:

[('$', 0, 0), ('3', 3, 3), ('5', 7, 11), ('7', 5, 6), ('15', 6, 9), ('16', 11, 20), ('17', 8, 13), ('18', 9, 16), ('19', 10, 18)]
Run Code Online (Sandbox Code Playgroud)

moz*_*way 5

使用natsort(自然排序),str.isdigit您可以自然地对数字进行排序,同时首先保留非数字。但您可能期望的更普遍的规则尚不清楚。

from natsort import natsorted 

array = [('$', 0, 0), ('3', 3, 3), ('7', 5, 6), ('15', 6, 9), ('5', 7, 11), ('17', 8, 13), ('18', 9, 16), ('19', 10, 18), ('16', 11, 20)]
sorted_array = natsorted(array, key=lambda x:(x[0].isdigit(), x))
print(sorted_array)
Run Code Online (Sandbox Code Playgroud)

输出:

[('$', 0, 0), ('3', 3, 3), ('5', 7, 11), ('7', 5, 6), ('15', 6, 9), ('16', 11, 20), ('17', 8, 13), ('18', 9, 16), ('19', 10, 18)]
Run Code Online (Sandbox Code Playgroud)