python如何同時對兩個字段優雅的排序

2021-10-09 12:00:13 字數 1851 閱讀 7251

目錄

方法一:最憨厚的排序

方法二:sorted優雅的排序

總結:學無止境

工作中遇到乙個有意思的排序問題,資料結構抽象出來大概是這樣的:乙個列表,列表中的子元素是字典,字典中的key有3個,id表示唯一值元素,count表示某個id在mongodb**現的次數,name表示id對應的名稱,示例如下:

id_list = [, ,

, ,, ,

]

現在的排序規則為:按次數倒序,次數相同按id公升序。

最最本能的思路如下:

# 1.先按次數排序得到乙個新的列表count_list

# 2.遍歷count_list中的元素,如果出現的次數比之前的元素少,直接追加到result_list;

# 3.如果次數相等,id比count_list中最後乙個元素大,直接追加到result_list;

# 4.如果次數相等,id比count_list中最後乙個元素小,那麼就需要和result_list中所有次數相同的

# 元素比較,找到第1個id值小的元素,放到其之後;

# 5.如果遍歷完之後所有id都比當前值大,將其放到該次數下第1個位置

**:

def sort_by_two_field(arr):

"""通過指定的兩個欄位對陣列排序,排序規則為:按次數倒序,次數相同按id公升序

:param arr:

:return:

"""result_list =

count_list = sorted(arr, key=lambda x: x['count'], reverse=true)

# print(count_list)

for idx, element in enumerate(count_list):

if idx == 0:

continue

if element['count'] < result_list[-1]['count']:

else:

if element['id'] > result_list[-1]['id']:

continue

index = idx - 1

while result_list[index]['count'] == element['count']:

if result_list[index]['id'] < element['id']:

result_list.insert(index+1, element)

break

index -= 1

else:

result_list.insert(index + 1, element)

return result_list

執行結果:

上面憨憨的方法雖然實現了,但是總覺得怪醜的,其實python中的sorted欄位為我們提供了優雅的多字段排序,但是上面描述的這種情況下的難點是乙個字段公升序,乙個字段降序,而reverse引數不可能同時實現又公升序又降序的需求,這個時候可以轉換一下思路。關鍵在於id是數字型別,那麼正數的公升序就可以通過負數的倒序來達到同樣的效果。這樣,就達到了同一。優雅的**如下:

print(sorted(id_list, key=lambda x:(-x['count'], int(x['id']))))
執行結果是一樣。

GROUP BY 兩個字段

create table test a varchar 10 b varchar 10 c int insert into test values a 甲 1 insert into test values a 甲 1 insert into test values a 甲 1 insert int...

SQL語句order by兩個字段同時排序問題

可能對不少來說非常簡單,但是我覺得在一定程度上對我還是有些迷惑之處,下面就通過hibernate中的hql語句來介紹下這類問題的效果。首先hql語句 from topic t where t.id 2 order by t.type desc,t.number desc也可以按照下面的寫法 from...

Mysql如何根據兩個字段排序?

假如我要對以下sql查詢語句的查詢結果進行排序 兩個欄位a,b select a,b,c,d,e from table name 1.先按照a公升序,再按照b降序 select a,b,c,d,e from table name order by a,b desc 也可以寫為 因為預設公升序,可以不...