日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

python3字典升序排序_Python(32)常用指引:排序指南

發布時間:2025/3/20 python 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 python3字典升序排序_Python(32)常用指引:排序指南 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

排序指南

>>>

>>> sorted("This is a test string from Andrew".split(), key=str.lower)
['a', 'Andrew', 'from', 'is', 'string', 'test', 'This']

key?形參的值應該是一個函數,它接受一個參數并并返回一個用于排序的鍵。這種技巧速度很快,因為對于每個輸入記錄只會調用一次 key 函數。一種常見的模式是使用對象的一些索引作為鍵對復雜對象進行排序。例如:>>>>>> student_tuples = [... ('john', 'A', 15),... ('jane', 'B', 12),... ('dave', 'B', 10),... ]>>> sorted(student_tuples, key=lambda student: student[2]) # sort by age
[('dave', 'B', 10), ('jane', 'B', 12), ('john', 'A', 15)]同樣的技術也適用于具有命名屬性的對象。例如:>>>>>> class Student:... def __init__(self, name, grade, age):... self.name = name... self.grade = grade... self.age = age... def __repr__(self):... return repr((self.name, self.grade, self.age))>>>>>> student_objects = [... Student('john', 'A', 15),... Student('jane', 'B', 12),... Student('dave', 'B', 10),... ]>>> sorted(student_objects, key=lambda student: student.age) # sort by age
[('dave', 'B', 10), ('jane', 'B', 12), ('john', 'A', 15)]

Operator 模塊函數

升序和降序

排序穩定性和排序復雜度

排序保證是?穩定?的。這意味著當多個記錄具有相同的鍵值時,將保留其原始順序。>>> data = [('red', 1), ('blue', 1), ('red', 2), ('blue', 2)]>>> sorted(data, key=itemgetter(0))
[('blue', 1), ('blue', 2), ('red', 1), ('red', 2)]注意?blue?的兩個記錄如何保留它們的原始順序,以便?('blue',?1)?保證在?('blue',?2)?之前。這個美妙的屬性允許你在一系列排序步驟中構建復雜的排序。例如,要按?grade?降序然后?age?升序對學生數據進行排序,請先?age?排序,然后再使用?grade?排序:>>> s = sorted(student_objects, key=attrgetter('age')) # sort on secondary key>>> sorted(s, key=attrgetter('grade'), reverse=True) # now sort on primary key, descending
[('dave', 'B', 10), ('jane', 'B', 12), ('john', 'A', 15)]這可以被抽象為一個包裝函數,該函數能接受一個列表以及字段和順序的元組,以對它們進行多重排序。>>> def multisort(xs, specs):... for key, reverse in reversed(specs):... xs.sort(key=attrgetter(key), reverse=reverse)... return xs>>> multisort(list(student_objects), (('grade', True), ('age', False)))
[('dave', 'B', 10), ('jane', 'B', 12), ('john', 'A', 15)]Python 中使用的?Timsort?算法可以有效地進行多種排序,因為它可以利用數據集中已存在的任何排序。

使用裝飾-排序-去裝飾的舊方法

這個三個步驟被稱為 Decorate-Sort-Undecorate :
  • 首先,初始列表使用控制排序順序的新值進行修飾。
  • 然后,裝飾列表已排序。
  • 最后,刪除裝飾,創建一個僅包含新排序中初始值的列表。
例如,要使用DSU方法按?grade?對學生數據進行排序:>>> decorated = [(student.grade, i, student) for i, student in enumerate(student_objects)]>>> decorated.sort()>>> [student for grade, i, student in decorated] # undecorate
[('john', 'A', 15), ('jane', 'B', 12), ('dave', 'B', 10)]這方法語有效是因為元組按字典順序進行比較,先比較第一項;如果它們相同則比較第二個項目,依此類推。不一定在所有情況下都要在裝飾列表中包含索引?i?,但包含它有兩個好處:
  • 排序是穩定的——如果兩個項具有相同的鍵,它們的順序將保留在排序列表中。
  • 原始項目不必具有可比性,因為裝飾元組的排序最多由前兩項決定。因此,例如原始列表可能包含無法直接排序的復數。
這個方法的另一個名字是 Randal L. Schwartz 在 Perl 程序員中推廣的?Schwartzian transform。既然 Python 排序提供了鍵函數,那么通常不需要這種技術。

使用?cmp?參數的舊方法

def cmp_to_key(mycmp):'Convert a cmp= function into a key= function'class K:def __init__(self, obj, *args):self.obj = objdef __lt__(self, other):return mycmp(self.obj, other.obj) < 0def __gt__(self, other):return mycmp(self.obj, other.obj) > 0def __eq__(self, other):return mycmp(self.obj, other.obj) == 0def __le__(self, other):return mycmp(self.obj, other.obj) <= 0def __ge__(self, other):return mycmp(self.obj, other.obj) >= 0def __ne__(self, other):return mycmp(self.obj, other.obj) != 0return K要轉換為鍵函數,只需包裝舊的比較函數:>>> sorted([5, 2, 4, 1, 3], key=cmp_to_key(reverse_numeric))
[5, 4, 3, 2, 1]在 Python 3.2 中,?functools.cmp_to_key()?函數被添加到標準庫中的?functools?模塊中。

其它

  • 對于區域相關的排序,請使用?locale.strxfrm()?作為鍵函數,或者?locale.strcoll()?作為比較函數。
  • reverse?參數仍然保持排序穩定性(因此具有相等鍵的記錄保留原始順序)。有趣的是,通過使用內置的?reversed()?函數兩次,可以在沒有參數的情況下模擬該效果:>>> data = [('red', 1), ('blue', 1), ('red', 2), ('blue', 2)]>>> standard_way = sorted(data, key=itemgetter(0), reverse=True)>>> double_reversed = list(reversed(sorted(reversed(data), key=itemgetter(0))))>>> assert standard_way == double_reversed>>> standard_way
    [('red', 1), ('red', 2), ('blue', 1), ('blue', 2)]
  • 在兩個對象之間進行比較時,保證排序例程使用?__lt__()?。因此,通過定義?__lt__()?方法,可以很容易地為類添加標準排序順序:>>> Student.__lt__ = lambda self, other: self.age < other.age>>> sorted(student_objects)
    [('dave', 'B', 10), ('jane', 'B', 12), ('john', 'A', 15)]
  • 鍵函數不需要直接依賴于被排序的對象。鍵函數還可以訪問外部資源。例如,如果學生成績存儲在字典中,則可以使用它們對單獨的學生姓名列表進行排序:>>> students = ['dave', 'john', 'jane']>>> newgrades = {'john': 'F', 'jane':'A', 'dave': 'C'}>>> sorted(students, key=newgrades.__getitem__)
    ['jane', 'dave', 'john']

總結

以上是生活随笔為你收集整理的python3字典升序排序_Python(32)常用指引:排序指南的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: www日本www | 天天干天天色天天射 | 成人国产一区二区三区 | 亚洲欧美视频在线 | 福利所第一导航 | 葵司ssni-879在线播放 | 日本网站免费观看 | 亚洲19p| 免费黄色一区二区 | 日韩一级黄色 | 久久久久久亚洲精品中文字幕 | 永久免费看mv网站入口78 | 久久久国产精品成人免费 | 五月天欧美 | 亚洲无色 | 老妇裸体性激交老太视频 | 四虎一级片 | 热久久免费| 无码人妻熟妇av又粗又大 | 亚洲乱熟女一区二区三区小说 | 精品久久久国产 | 欧美日本道 | 精品久久久久久久久久久久久久久久久久 | 亚洲精品乱码久久久久久蜜桃动漫 | 成年人免费网址 | 亚洲精品一区二区三区精华液 | 亚洲高清中文字幕 | 日韩午夜视频在线观看 | 日韩欧美性视频 | 欧美精品在线观看一区二区 | www射 | 99久久九九| 中文字幕av日韩 | 91成人免费在线 | 激情综合五月天 | 少妇粉嫩小泬喷水视频www | 国产精品搬运 | 婷婷午夜| 99cao| 久久青青操 | 日本少妇高潮喷水xxxxxxx | 色在线视频 | 亚洲欧美国产一区二区 | 91中文在线观看 | av黄色网址 | 亚洲黄色在线观看 | 国产精品成人一区二区三区 | 精品国产成人亚洲午夜福利 | 一区二区三区国产av | 三级做爰在线观看视频 | www.黄色大片 | 国产乱码精品1区2区3区 | 调教91| 中文字幕一区二区三区人妻在线视频 | 亚洲av日韩av不卡在线观看 | heyzo北岛玲在线播放 | 99热这里都是精品 | av资源天堂 | 久久aaaa片一区二区 | 全国探花| 婷婷亚洲精品 | 神马一区二区三区 | 日日干夜夜爽 | zzji欧美大片 | 日本做爰高潮又黄又爽 | 自拍偷拍激情视频 | 国产一区二区三区三州 | 国产精品一区二区av白丝下载 | 五级 黄 色 片 | 国产又粗又猛又爽又黄的视频在线观看动漫 | 无码无套少妇毛多18pxxxx | 青青偷拍视频 | 欧美美女一区二区三区 | 丰满少妇被猛烈进入 | 中文字幕日韩一区 | 久久久久国产精品夜夜夜夜夜 | 国产一区免费在线 | 午夜爱爱毛片xxxx视频免费看 | 久久99精品国产麻豆91樱花 | 色欲亚洲Av无码精品天堂 | 久久爱影视 | 日本视频网站在线观看 | 爱情岛亚洲论坛入口福利 | 看片网址国产福利av中文字幕 | 国产女人高潮视频 | 97人妻精品一区二区三区视频 | 污视频在线 | 精品久久久一区二区 | 成人精品三级av在线看 | 国产超碰精品 | 337p嫩模大胆色肉噜噜噜 | 91破处视频 | 色一情一区二 | 禁漫天堂免费网站 | 欧美三日本三级少妇三级99观看视频 | 波多野结衣在线网址 | 日本东京热一区二区 | 国产在线精 | 澳门黄色录像 |