目錄
方法一:最憨厚的排序
方法二:sorted優雅的排序
總結:學無止境
工作中遇到乙個有意思的排序問題,資料結構抽象出來大概是這樣的:乙個列表,列表中的子元素是字典,字典中的key有3個,id表示唯一值元素,count表示某個id在mongodb**現的次數,name表示id對應的名稱,示例如下:
現在的排序規則為:按次數倒序,次數相同按id公升序。id_list = [, ,
, ,, ,
]
最最本能的思路如下:
# 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 也可以寫為 因為預設公升序,可以不...