我需要使用该sorted()函数才能从这里获得:test2 = [1,'2',3,'4',5,'A']到这里(创建一个新列表,它首先包含已排序的整数,然后是已排序的字符串):test2 = [1,3,5,'2','4','A']
3 回答
眼眸繁星
TA贡献1873条经验 获得超9个赞
sorted(test2, key=lambda x: (isinstance(x, str), x))
这依赖于False < True
元组按字典顺序排序的事实。
更多细节:
元组通常用于按多个指标进行排序。考虑一下:
key=lambda x: isinstance(x, str)
该key
关键字参数来sorted
告诉它由给定的调用,而不是由vaules自己的结果值进行排序。此键将返回False
整数和True
字符串。由于False
相当于0
和True
to1
,False
被认为更小,所有整数将在列表中排在第一位。
这只是我们想要的一半,因为整数和字符串之间没有排序。这是元组进来的。上面的关键功能:
key=lambda x: (isinstance(x, str), x)
为每个元素返回一个元组。元组首先按它们的第一个元素排序。如果两个元组具有等效的第一个元素,则比较它们的第二个元素,依此类推。这称为词典排序。假设我们有这个列表:
this = ["a", 5, "b", 3]
key 函数将按顺序返回:
(True, "a"), (False, 5), (True, "b"), (False, 3)
元组将首先按它们的第一个元素(布尔值)排序:
(False, 5), (False, 3), (True, "a"), (True, "b")
现在,我们有两对元组,它们的第一个元素相等。每对将按其第二个元素在内部排序:
(False, 3), (False, 5), (True, "a"), (True, "b")
最终结果不是元组本身,而是每个元组的关键函数的相应输入:
[3, 5, "a", "b"]
实际上,该算法不需要“两次”排序,但概念上是相同的。
添加回答
举报
0/150
提交
取消