python3字典升序排序_Python(32)常用指引:排序指南
生活随笔
收集整理的這篇文章主要介紹了
python3字典升序排序_Python(32)常用指引:排序指南
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
排序指南
>>>
>>> sorted("This is a test string from Andrew".split(), key=str.lower)
['a', 'Andrew', 'from', 'is', 'string', 'test', 'This']
[('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 :- 首先,初始列表使用控制排序順序的新值進行修飾。
- 然后,裝飾列表已排序。
- 最后,刪除裝飾,創建一個僅包含新排序中初始值的列表。
[('john', 'A', 15), ('jane', 'B', 12), ('dave', 'B', 10)]這方法語有效是因為元組按字典順序進行比較,先比較第一項;如果它們相同則比較第二個項目,依此類推。不一定在所有情況下都要在裝飾列表中包含索引?i?,但包含它有兩個好處:
- 排序是穩定的——如果兩個項具有相同的鍵,它們的順序將保留在排序列表中。
- 原始項目不必具有可比性,因為裝飾元組的排序最多由前兩項決定。因此,例如原始列表可能包含無法直接排序的復數。
使用?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)常用指引:排序指南的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python import reques
- 下一篇: python绘制饼状图带圆心距_matp