Python列表-排序整数,然后是字符串

时间:2018-11-11 06:00:15

标签: python sorting

我需要使用sorted()函数才能从此处获取:

test2 = [1,'2',3,'4',5,'A']

到此处(创建一个新列表,该列表首先具有已排序的整数,然后具有已排序的字符串):

test2 = [1,3,5,'2','4','A']

3 个答案:

答案 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 1True被认为较小,所有整数将在列表中排在首位。

这只是我们想要的一半,因为整数和字符串没有在它们之间排序。这是元组的输入。上面的关键功能:

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)