我需要使用sorted()
函数才能从此处获取:
test2 = [1,'2',3,'4',5,'A']
到此处(创建一个新列表,该列表首先具有已排序的整数,然后具有已排序的字符串):
test2 = [1,3,5,'2','4','A']
答案 0 :(得分:4)
sorted(test2, key=lambda x: (isinstance(x, str), x))
这取决于False < True
和元组按字典顺序排序的事实。
组合经常用于按多个指标进行排序。 考虑一下:
key=lambda x: isinstance(x, str)
key
的{{1}}关键字参数告诉它根据给定的callable的结果而不是按值本身对值进行排序。
该键将返回sorted
(整数)和False
(字符串)。由于False
is equivalent to 0
and True
to 1
,True
被认为较小,所有整数将在列表中排在首位。
这只是我们想要的一半,因为整数和字符串没有在它们之间排序。这是元组的输入。上面的关键功能:
False
为每个元素返回一个元组。元组首先按其第一个元素排序。如果两个元组的第一个元素相等,则比较它们的第二个元素,依此类推。这称为lexigoraphic sorting。 假设我们有以下列表:
key=lambda x: (isinstance(x, str), x)
键函数将按以下顺序返回:
this = ["a", 5, "b", 3]
元组将首先按其第一个元素boolean排序:
(True, "a"), (False, 5), (True, "b"), (False, 3)
现在,我们有两对元组,它们的第一个元素相等。每对将通过第二个元素在内部 进行排序:
(False, 5), (False, 3), (True, "a"), (True, "b")
最终结果不是元组本身,而是每个元组的键函数的相应输入:
(False, 3), (False, 5), (True, "a"), (True, "b")
实际上,该算法不需要“两次”排序,但是在概念上是相同的。
答案 1 :(得分:0)
尝试一下:
test2 = sorted([i for i in test2 if isinstance(i, int)]) + \
sorted([i for i in test2 if isinstance(i, str)])
答案 2 :(得分:0)
分别过滤数字和字符串,然后将它们连接起来。
num=list(filter( lambda x: type(x)==int , test2 ))
string=list(filter( lambda x: type(x)==str , test2 ))
sorted(num)+sorted(string)