如何对混合类型列表进行排序?

Ben*_*Ben 4 python

我有一个如下所示的列表(列表中的“None”是一个字符串,而不是 None):

profit = [1  , 20 , 3  , 5  , 90 , 'None', 900, 67 , 'None'] 
name   = ['a', 'b', 'c', 'e', 'd', 'f'   , 'g', 'k', 'pp']
Run Code Online (Sandbox Code Playgroud)

profit列表是“利润”值的列表,因此我必须以相反的顺序对其进行排序,以便最高的值位于开头。

此外,我还有更多具有相同长度的列表,它们代表与列表相关的其他内容profit(例如name显示利润来自何处的列表)。

现在,我编写了以下代码profit以相反的顺序对列表进行排序,并保存索引,以便可以name根据获得的索引对其他列表(如 )进行排序:

sorted_ind = sorted(range(len(profit)), key=lambda k: profit[k], reverse=True)
for i in sorted_ind:
    print('{0:^50}|{1:^7}|'.format(profit[i], name[I]))
Run Code Online (Sandbox Code Playgroud)

profit当我的列表仅包含数字时,上面的代码效果很好。然而,在某些情况下我没有利润,我希望这个值是“无”(我不想将其设置为 0)。

我正在尝试执行相同的排序,但所有 None 索引都将位于列表的末尾 - 对所有整数进行排序并在末尾插入 None 。

有什么好的办法可以做到吗?

Tom*_*koo 6

您可以对排序函数使用“优先级”key来检查类型:

>>> sorted(profit, key=lambda x: (isinstance(x, int), x), reverse=True)
[900, 90, 67, 20, 5, 3, 1, 'None', 'None']
Run Code Online (Sandbox Code Playgroud)

如果您这样做只是为了对names列表进行排序,那么没有必要对索引进行排序,您应该使用zip

profits = [1, 20, 3, 5, 90, 'None', 900, 67, 'None']
names = ['a', 'b', 'c', 'e', 'd', 'f', 'g', 'k', 'pp']

sorted_ind = sorted(zip(profits, names), key=lambda tup: (isinstance(tup[0], int), tup[0]), reverse=True)
for profit, name in sorted_ind:
    print('{0:^50}|{1:^7}|'.format(profit, name))
Run Code Online (Sandbox Code Playgroud)

给出:

                       900                        |   g   |
                        90                        |   d   |
                        67                        |   k   |
                        20                        |   b   |
                        5                         |   e   |
                        3                         |   c   |
                        1                         |   a   |
                       None                       |   f   |
                       None                       |  pp   |
Run Code Online (Sandbox Code Playgroud)