所以我有一個看起來像這樣的串列:people_list = [[str name, int numerical value]]其中有 n 個串列people_list。隨著實際的資料,它是這樣的:people_list = [['jim', 30000], ['james', 30000]]。我需要對此串列進行排序首先根據每個嵌套串列中的數值,所以排序基于people_list[i][1]哪里i是第n個嵌套串列,而整個people_list needs從最高排序到最低數值。然后,如果數值中有任何聯系,我需要根據名稱按字母順序對聯系串列進行排序,因此people_list[i][0].
我嘗試使用下面的代碼進行排序,但輸出并不完全符合我的需要,而且我還沒有在網上找到任何其他資源來讓它按照我需要的方式排序。
people_list = [['jim', 33000], ['james', 22000], ['john', 33000], ['zack', 10000]]
sorted_by_int_then_name = sorted(people_list, key=lambda person: (person[1], person[0]), reverse=True)
此代碼的輸出是:
>>> sorted_by_int_then_name
[['john', 33000], ['jim', 33000], ['james', 22000], ['zack', 10000]]
這是按數字正確排序的,但名稱沒有像我需要的那樣按字母順序排序。我認為我遇到的問題可能是因為我正在使用該reverse=True引數,但如果我不包含該引數,則串列將從最低數值到最高數值排序。我正在尋找的輸出是這樣的:
>>> sorted_by_int_then_name
[['jim', 33000], ['john', 33000], ['james', 22000], ['zack', 10000]]
如何正確按數值排序people_list[i][1],然后people_list[i][0]在數值系結時按排序?
我在 Ubuntu 20.04.3 LTS 上使用 python 版本 3.8.10 運行此代碼
uj5u.com熱心網友回復:
一種方法是將整數乘以-1而不是使用reverse=True:
people_array = [['jim', 33000], ['james', 22000], ['john', 33000], ['zack', 10000]]
sorted_by_int_then_name = sorted(people_array, key=lambda person: (-1 * person[1], person[0]))
print(sorted_by_int_then_name)
輸出
[['jim', 33000], ['john', 33000], ['james', 22000], ['zack', 10000]]
作為替代方案,并利用sorted是stable的事實,使用兩遍排序:
from operator import itemgetter
people_array = [['jim', 33000], ['james', 22000], ['john', 33000], ['zack', 10000]]
sorted_by_int_then_name = sorted(people_array, key=itemgetter(0))
sorted_by_int_then_name.sort(key=itemgetter(1), reverse=True)
print(sorted_by_int_then_name)
輸出
[['jim', 33000], ['john', 33000], ['james', 22000], ['zack', 10000]]
兩遍排序可以更快,請參閱this。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/314578.html
