国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

PyTips 0x0e - Python 內(nèi)置排序方法

Baoyuan / 654人閱讀

摘要:項(xiàng)目地址提供兩種內(nèi)置排序方法,一個(gè)是只針對(duì)的原地排序方法,另一個(gè)是針對(duì)所有可迭代對(duì)象的非原地排序方法。

項(xiàng)目地址:https://git.io/pytips

Python 提供兩種內(nèi)置排序方法,一個(gè)是只針對(duì) List 的原地(in-place)排序方法 list.sort(),另一個(gè)是針對(duì)所有可迭代對(duì)象的非原地排序方法 sorted()。

所謂原地排序是指會(huì)立即改變被排序的列表對(duì)象,就像 append()/pop() 等方法一樣:

from random import randrange
lst = [randrange(1, 100) for _ in range(10)]
print(lst)
lst.sort()

print(lst)
[57, 81, 32, 74, 12, 89, 76, 21, 75, 6]
[6, 12, 21, 32, 57, 74, 75, 76, 81, 89]

sorted() 不限于列表,而且會(huì)生成并返回一個(gè)新的排序后的列表,原有對(duì)象不受影響:

lst = [randrange(1, 100) for _ in range(10)]
tup = tuple(lst)

print(sorted(tup)) # return List
print(tup)
[11, 36, 39, 41, 48, 48, 50, 76, 79, 99]
(11, 41, 79, 48, 48, 99, 39, 76, 36, 50)

雖然不是原地排序,但如果是傳入生成器,還是會(huì)被循環(huán)掉的:

tup = (randrange(1, 100) for _ in range(10))
print(sorted(tup))
for i in tup:
    print(i)
[5, 12, 15, 21, 57, 69, 73, 83, 90, 95]
Key

對(duì)簡(jiǎn)單的迭代對(duì)象進(jìn)行排序只需要逐次提取元素進(jìn)行比較即可,如果想要對(duì)元素進(jìn)行一些操作再進(jìn)行比較,可以通過 key 參數(shù)指定一個(gè)取值函數(shù)。這里的 key 用法很像 0x02 函數(shù)式編程提到的 map/filter 所接受的函數(shù),不同之處在于這里的 key 函數(shù)只是在排序比較前對(duì)元素進(jìn)行處理,并不會(huì)改變?cè)卦镜闹担缥覀儗?duì)一組整數(shù)按照(key 可以理解為按照的意思)絕對(duì)值進(jìn)行排序:

lst = [randrange(-10, 10) for _ in range(10)]
print(lst)
print(sorted(lst, key=abs))
[0, 7, 0, -10, 3, 7, -9, -10, -7, -10]
[0, 0, 3, 7, 7, -7, -9, -10, -10, -10]

或者,當(dāng)?shù)鷮?duì)象的元素較為復(fù)雜時(shí),可以只按照其中的某些屬性進(jìn)行排序:

lst = list(zip("hello world hail python".split(), [randrange(1, 10) for _ in range(4)]))
print(lst)
print(sorted(lst, key=lambda item: item[1]))
[("hello", 3), ("world", 3), ("hail", 9), ("python", 9)]
[("hello", 3), ("world", 3), ("hail", 9), ("python", 9)]

Python 的 operator 標(biāo)準(zhǔn)庫提供了一些操作符相關(guān)的方法,可以更方便地獲取元素的屬性:

from operator import itemgetter, attrgetter

print(lst)
print(sorted(lst, key=itemgetter(1)))

# 一切都只是函數(shù)
fitemgetter = lambda ind: lambda item: item[ind]
print(sorted(lst, key=fitemgetter(1)))

class P(object):
    def __init__(self, w, n):
        self.w = w
        self.n = n
    def __repr__(self):
        return "{}=>{}".format(self.w, self.n)
ps = [P(i[0], i[1]) for i in lst]

print(sorted(ps, key=attrgetter("n")))
[("hello", 3), ("world", 3), ("hail", 9), ("python", 9)]
[("hello", 3), ("world", 3), ("hail", 9), ("python", 9)]
[("hello", 3), ("world", 3), ("hail", 9), ("python", 9)]
[hello=>3, world=>3, hail=>9, python=>9]

經(jīng)過 key 處理之后會(huì)通過 < 符號(hào)對(duì)兩個(gè)元素進(jìn)行比較,在 Python 2.7 的版本中,sorted() 還可以接收另外一個(gè)參數(shù) cmp,用來接管 < 的比較過程。但是在 Python 3.5 中已經(jīng)全面摒棄了這一做法,包括 sorted() 中的 cmp 參數(shù)和對(duì)象中的 __cmp__ 比較操作,只有在需要向后兼容的時(shí)候才可能在 Python 3.5 用到這一功能,其替換的方法為:

from functools import cmp_to_key as new_cmp_to_key

# new_cmp_to_key works like this
def cmp_to_key(mycmp):
    "Convert a cmp= function into a key= function"
    class K:
        def __init__(self, obj, *args):
            self.obj = obj
        def __lt__(self, other):
            return mycmp(self.obj, other.obj) < 0
    return K
def reverse_cmp(x, y):
    return y[1] - x[1]
sorted(lst, key=cmp_to_key(reverse_cmp))
[("hail", 9), ("python", 9), ("hello", 3), ("world", 3)]

如果想要按照遞減排序,只需要設(shè)定參數(shù) reverse = True 即可。


歡迎關(guān)注公眾號(hào) PyHub!

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/37843.html

相關(guān)文章

  • PyTips 0x01 - 迭代器與生成器

    摘要:項(xiàng)目地址迭代器與生成器迭代器與生成器是中比較常用又很容易混淆的兩個(gè)概念,今天就把它們梳理一遍,并舉一些常用的例子。生成器前面說到創(chuàng)建迭代器有種方法,其中第三種就是生成器。 項(xiàng)目地址:https://git.io/pytips 迭代器與生成器 迭代器(iterator)與生成器(generator)是 Python 中比較常用又很容易混淆的兩個(gè)概念,今天就把它們梳理一遍,并舉一些常用的例...

    chemzqm 評(píng)論0 收藏0
  • PyTips 0x16 - Python 迭代器工具

    摘要:借鑒了中的某些迭代器的構(gòu)造方法,并在中實(shí)現(xiàn)該模塊是通過實(shí)現(xiàn),源代碼。 項(xiàng)目地址:https://git.io/pytips 0x01 介紹了迭代器的概念,即定義了 __iter__() 和 __next__() 方法的對(duì)象,或者通過 yield 簡(jiǎn)化定義的可迭代對(duì)象,而在一些函數(shù)式編程語言(見 0x02 Python 中的函數(shù)式編程)中,類似的迭代器常被用于產(chǎn)生特定格式的列表(或序列)...

    mayaohua 評(píng)論0 收藏0
  • PyTips 0x0b - Python 無處不在的else

    摘要:可以通過一個(gè)簡(jiǎn)單的例子來展示當(dāng)然,也可以用狀態(tài)變量的做法來替代總結(jié)有人覺得的這些用法違反直覺或者是而非,不值得提倡。 項(xiàng)目地址:https://git.io/pytips 我們都知道 Python 中 else 的基本用法是在條件控制語句中的 if...elif...else...,但是 else 還有兩個(gè)其它的用途,一是用于循環(huán)的結(jié)尾,另一個(gè)是用在錯(cuò)誤處理的 try 中。這原本是 P...

    jaysun 評(píng)論0 收藏0
  • PyTips 0x14 - Python 描述符

    摘要:項(xiàng)目地址本篇主要關(guān)于三個(gè)常用內(nèi)置方法,,在語言的設(shè)計(jì)中,通常的語法操作最終都會(huì)轉(zhuǎn)化為方法調(diào)用,例如相當(dāng)于中的描述符就是將對(duì)象屬性的獲取賦值以及刪除等行為轉(zhuǎn)換為方法調(diào)用的協(xié)議例如我們要獲取一個(gè)對(duì)象的屬性,可以通過的方式取得而通過的 項(xiàng)目地址:https://git.io/pytips 本篇主要關(guān)于三個(gè)常用內(nèi)置方法:property(),staticmethod(),classmethod...

    since1986 評(píng)論0 收藏0
  • PyTips 0x10 - Python 的堆與優(yōu)先隊(duì)列

    摘要:項(xiàng)目地址中內(nèi)置的庫和分別提供了堆和優(yōu)先隊(duì)列結(jié)構(gòu),其中優(yōu)先隊(duì)列本身也是基于實(shí)現(xiàn)的,因此我們這次重點(diǎn)看一下。堆可以用于實(shí)現(xiàn)調(diào)度器例見之協(xié)程,更常用的是優(yōu)先隊(duì)列例如。 項(xiàng)目地址:https://git.io/pytips Python 中內(nèi)置的 heapq 庫和 queue 分別提供了堆和優(yōu)先隊(duì)列結(jié)構(gòu),其中優(yōu)先隊(duì)列 queue.PriorityQueue 本身也是基于 heapq 實(shí)現(xiàn)的,因...

    dreambei 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<