python3字典升序排序_Python(32)常用指引:排序指南
生活随笔
收集整理的這篇文章主要介紹了
python3字典升序排序_Python(32)常用指引:排序指南
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
排序指南
>>>
>>> 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)]同樣的技術(shù)也適用于具有命名屬性的對象。例如:>>>>>> 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 模塊函數(shù)
升序和降序
排序穩(wěn)定性和排序復(fù)雜度
排序保證是?穩(wěn)定?的。這意味著當(dāng)多個(gè)記錄具有相同的鍵值時(shí),將保留其原始順序。>>> data = [('red', 1), ('blue', 1), ('red', 2), ('blue', 2)]>>> sorted(data, key=itemgetter(0))[('blue', 1), ('blue', 2), ('red', 1), ('red', 2)]注意?blue?的兩個(gè)記錄如何保留它們的原始順序,以便?('blue',?1)?保證在?('blue',?2)?之前。這個(gè)美妙的屬性允許你在一系列排序步驟中構(gòu)建復(fù)雜的排序。例如,要按?grade?降序然后?age?升序?qū)W(xué)生數(shù)據(jù)進(jìn)行排序,請先?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)]這可以被抽象為一個(gè)包裝函數(shù),該函數(shù)能接受一個(gè)列表以及字段和順序的元組,以對它們進(jìn)行多重排序。>>> 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?算法可以有效地進(jìn)行多種排序,因?yàn)樗梢岳脭?shù)據(jù)集中已存在的任何排序。
使用裝飾-排序-去裝飾的舊方法
這個(gè)三個(gè)步驟被稱為 Decorate-Sort-Undecorate :- 首先,初始列表使用控制排序順序的新值進(jìn)行修飾。
- 然后,裝飾列表已排序。
- 最后,刪除裝飾,創(chuàng)建一個(gè)僅包含新排序中初始值的列表。
[('john', 'A', 15), ('jane', 'B', 12), ('dave', 'B', 10)]這方法語有效是因?yàn)樵M按字典順序進(jìn)行比較,先比較第一項(xiàng);如果它們相同則比較第二個(gè)項(xiàng)目,依此類推。不一定在所有情況下都要在裝飾列表中包含索引?i?,但包含它有兩個(gè)好處:
- 排序是穩(wěn)定的——如果兩個(gè)項(xiàng)具有相同的鍵,它們的順序?qū)⒈A粼谂判蛄斜碇小?/li>
- 原始項(xiàng)目不必具有可比性,因?yàn)檠b飾元組的排序最多由前兩項(xiàng)決定。因此,例如原始列表可能包含無法直接排序的復(fù)數(shù)。
使用?cmp?參數(shù)的舊方法
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要轉(zhuǎn)換為鍵函數(shù),只需包裝舊的比較函數(shù):>>> sorted([5, 2, 4, 1, 3], key=cmp_to_key(reverse_numeric))[5, 4, 3, 2, 1]在 Python 3.2 中,?functools.cmp_to_key()?函數(shù)被添加到標(biāo)準(zhǔn)庫中的?functools?模塊中。
其它
- 對于區(qū)域相關(guān)的排序,請使用?locale.strxfrm()?作為鍵函數(shù),或者?locale.strcoll()?作為比較函數(shù)。
- reverse?參數(shù)仍然保持排序穩(wěn)定性(因此具有相等鍵的記錄保留原始順序)。有趣的是,通過使用內(nèi)置的?reversed()?函數(shù)兩次,可以在沒有參數(shù)的情況下模擬該效果:>>> 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)] - 在兩個(gè)對象之間進(jìn)行比較時(shí),保證排序例程使用?__lt__()?。因此,通過定義?__lt__()?方法,可以很容易地為類添加標(biāo)準(zhǔn)排序順序:>>> Student.__lt__ = lambda self, other: self.age < other.age>>> sorted(student_objects)
[('dave', 'B', 10), ('jane', 'B', 12), ('john', 'A', 15)] - 鍵函數(shù)不需要直接依賴于被排序的對象。鍵函數(shù)還可以訪問外部資源。例如,如果學(xué)生成績存儲(chǔ)在字典中,則可以使用它們對單獨(dú)的學(xué)生姓名列表進(jìn)行排序:>>> students = ['dave', 'john', 'jane']>>> newgrades = {'john': 'F', 'jane':'A', 'dave': 'C'}>>> sorted(students, key=newgrades.__getitem__)
['jane', 'dave', 'john']
總結(jié)
以上是生活随笔為你收集整理的python3字典升序排序_Python(32)常用指引:排序指南的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python import reques
- 下一篇: python绘制饼状图带圆心距_matp