我有一个如下所示的列表(列表中的“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 。
有什么好的办法可以做到吗?
您可以对排序函数使用“优先级”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)
| 归档时间: |
|
| 查看次数: |
419 次 |
| 最近记录: |