成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

Python3 CookBook | 數(shù)據(jù)結(jié)構(gòu)和算法(一)

崔曉明 / 1876人閱讀

摘要:提供了大量的內(nèi)置數(shù)據(jù)結(jié)構(gòu),包括列表,集合以及字典。這個問題很簡單,我的第一反應(yīng)是循環(huán)求和,然后計算平均值,顯然很麻煩。這時候就該登場了,它的作用是可以使鍵和值反轉(zhuǎn)過來。

文章首發(fā)于知乎專欄,歡迎關(guān)注。
https://zhuanlan.zhihu.com/py...

以下測試代碼全部基于 Python3。

Python 提供了大量的內(nèi)置數(shù)據(jù)結(jié)構(gòu),包括列表,集合以及字典。在工作和編碼中,可以說天天和它們打交道,經(jīng)常碰到查詢,排序和過濾等等這些問題,雖然每次解決這些問題并不困難,但總感覺代碼寫的很麻煩,不夠優(yōu)雅。

最近通過閱讀《Python3 CookBook》,了解了一些更優(yōu)秀的方法,做一些簡單記錄,與大家分享。

1、解壓可迭代對象賦值給多個變量

我們都知道,一個序列是可以賦值給多個變量的,就像下面這樣:

In [7]: p = (1, 2, 3)

In [8]: x, y, z = p

In [9]: x
Out[9]: 1

但如果接收的變量個數(shù)和序列元素個數(shù)不一致,就會報錯,如果你不知道元素個數(shù)的話,可以采用下面這樣的方式:

In [10]: x, *y = p

In [11]: y
Out[11]: [2, 3]

通過這種星號的方式,就可以解壓不確定個數(shù)或任意個數(shù)的可迭代對象了,是不是很棒呢?

那么,用這個方法可以解決哪些問題呢?

先來看一種情況,現(xiàn)在有一個序列,去掉第一個數(shù)和最后一個數(shù),然后求剩下數(shù)的平均值。

這個問題很簡單,我的第一反應(yīng)是循環(huán)求和,然后計算平均值,顯然很麻煩。這時候星號表達(dá)式就派上用場了:

def drop_first_last(items):
  first, *middle, last = items
  return avg(middle)

再看一種情況,比如字符串的分割:

In [12]: line = "drwxr-xr-x  41 zyx  staff   1.4K 11 24 08:53 zyx"

In [13]: info, *fields, homedir = line.split(" ")

In [14]: info
Out[14]: "drwxr-xr-x"

In [15]: homedir
Out[15]: "zyx"
2、保留最后 N 個元素

這個問題也是經(jīng)常會遇到的,比如只取文件中滿足要求的前五行,或者只返回滿足要求的最新十條數(shù)據(jù)。我的第一反應(yīng)是列表,然后通過 push 和 pop 來操作列表來實現(xiàn)。

其實通過 collections.deque 可以很容易解決這個問題,使用 deque(maxlen=N) 構(gòu)造函數(shù)新建一個固定大小的隊列。當(dāng)新元素加入并且這個隊列已滿時,最先進(jìn)入隊列的元素便會被移除,符合先進(jìn)先出的原則。

In [16]: from collections import deque

In [17]: q = deque(maxlen=3)

In [18]: q.append(1)

In [19]: q.append(2)

In [20]: q.append(3)

In [21]: q
Out[21]: deque([1, 2, 3])

In [22]: q.append(4)

In [23]: q
Out[23]: deque([2, 3, 4])

如果沒有設(shè)置 maxlen 則是一個無限大小的隊列,可以通過 appendleft 和 pop 在隊首和隊尾添加刪除元素。

3、字典中的鍵映射多個值

現(xiàn)在有一個需求,構(gòu)建一個字典,key 是用戶 ID,value 為一個列表,列表元素可以是名字,電話等等,大概是這樣:

d = {"id": ["name", "phone"]}

如果我們自己構(gòu)建這個字典,可能會像下面這樣來實現(xiàn):

d = {}
for key, value in items:
  if key not in d:
    d[key] = value
  d[key].append(value)

很麻煩,如果使用 collections 的 defaultdict 就很簡單了。defaultdict 的一個特征就是它會自動初始化每個 key 剛開始對應(yīng)的值,所以我們只關(guān)注添加元素操作就可以了。

優(yōu)化后代碼就變成了這樣:

d = defaultdict(list)
for key, value in items:
  d[key].append(value)
4、字典排序

字典是無序的,但如果要控制字典中元素的順序呢?可以使用 colletions 中的 OrderedDict,如下:

d = OrderedDict()
d["foo"] = 1
d["bar"] = 2
d["spam"] = 3
d["grok"] = 4
# Outputs "foo 1", "bar 2", "spam 3", "grok 4"

for key in d:
  print(key, d[key])

OrderedDict 內(nèi)部維護(hù)這一個根據(jù)鍵插入順序排序的雙向鏈表。每次新元素插入時,便會被放在鏈表尾部,對于已經(jīng)存在的鍵,并不會改變鍵的順序。

但需要注意的是,OrderedDict 的大小是普通字典的兩倍,所以在構(gòu)建一個需要大量 OrderedDict 實例的數(shù)據(jù)結(jié)構(gòu)時,就要考慮大量內(nèi)存消耗的影響了。

5、字典的運(yùn)算

如何取出字典中的最小值,或者對字典進(jìn)行排序呢?

首先我們來看看直接使用普通的數(shù)學(xué)運(yùn)算函數(shù)

In [25]: d = {"a": 11, "b": 43, "c": 3, "d": 65}

In [26]: min(d)
Out[26]: "a"

它比較的邏輯是直接比較 key,然后取出對應(yīng)的 key,但如果要比較 value 呢?

In [28]: min(d.values())
Out[28]: 3

結(jié)果是正確的,但似乎并不完美,如果鍵值一起返回就完美了。這時候就該 zip 登場了,它的作用是可以使鍵和值反轉(zhuǎn)過來。

In [29]: min(zip(d.values(), d.keys()))
Out[29]: (3, "c")

它直接返回了值最小的鍵和值,這樣就很好了,不管需要哪個信息都可以直接使用。如果要對這個字典排序的話也很簡單:

In [34]: sorted(zip(d.values(), d.keys()))
Out[34]: [(3, "c"), (11, "a"), (43, "b"), (65, "d")]

先寫這么多吧,未完待續(xù)。。。

歡迎留言,或者添加我個人微信 zhangyx6a 交流溝通,不是微商。

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

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/44513.html

相關(guān)文章

  • Python3 CookBook | 數(shù)據(jù)結(jié)構(gòu)算法(二)

    摘要:以下測試代碼全部基于查找最大或最小的個元素工作中有時會遇到這樣的需求,取出數(shù)據(jù)中前面的值,或者最后的值。大家如果對堆數(shù)據(jù)結(jié)構(gòu)感興趣的話,可以繼續(xù)進(jìn)行深入研究,由于我了解的并不深,也沒辦法再展開了。 文章首發(fā)于知乎專欄,歡迎關(guān)注。https://zhuanlan.zhihu.com/py... 以下測試代碼全部基于 Python3 1、查找最大或最小的 N 個元素 工作中有時會遇到這樣的...

    geekidentity 評論0 收藏0
  • Python: 你不知道的 super

    摘要:整個過程還是比較清晰的,關(guān)鍵是要理解的工作方式,而不是想當(dāng)然地認(rèn)為調(diào)用了父類的方法。小結(jié)事實上,和父類沒有實質(zhì)性的關(guān)聯(lián)。 super() 的入門使用 在類的繼承中,如果重定義某個方法,該方法會覆蓋父類的同名方法,但有時,我們希望能同時實現(xiàn)父類的功能,這時,我們就需要調(diào)用父類的方法了,可通過使用 super 來實現(xiàn),比如: class Animal(object): def __...

    darkerXi 評論0 收藏0
  • 超實用的 Python 學(xué)習(xí)資源匯總

    摘要:鏈接中文翻譯常用庫推薦除了上面提到的之外,也是一個很好的選項。官網(wǎng)中文翻譯如果你要編寫簡單的爬蟲,來爬去互聯(lián)網(wǎng)上的信息,或者調(diào)用一些外部的機(jī)遇的接口,使用這個庫再也合適不過了。 作者:安龍 LeanCloud 工程師 引言 :前段時間有同學(xué)反映 Python 的學(xué)習(xí)資源匯總很少。那么學(xué)習(xí)資料哪個質(zhì)量更好,效率更高?Python 有哪些非常值得學(xué)習(xí)的庫?2017 年了學(xué) 2 還是學(xué) 3 ...

    寵來也 評論0 收藏0
  • Python Tips

    摘要:的三種數(shù)據(jù)類型字典列表元組,分別用花括號中括號小括號表示。約等于上句,可能是因為自定義變量名與內(nèi)部函數(shù)或變量同名了。下,默認(rèn)路徑一般為。的日志模塊中計時器定時器計劃任務(wù),。對象的問題怎樣忽略警告不打印煩人的警告打印到終端同時記錄到文件。 Python Enhancement Proposal。(PEP,Python增強(qiáng)建議書) Python之禪(import this) Pytho...

    Reducto 評論0 收藏0
  • Python每日練0006

    摘要:問題在某個集合中找到最大或最小的個元素解決方案使用模塊例如此外,這兩個函數(shù)都可以接受作為參數(shù),例如輸出為討論根據(jù)官方文檔對的介紹可以了解到提供了堆數(shù)據(jù)結(jié)構(gòu)的實現(xiàn),并且實現(xiàn)方式是小頂堆,也就是說每次的時候取出的是最小的元素首先使用將一個列 問題 在某個集合中找到最大或最小的N個元素 解決方案 使用heapq模塊 heapq.nlargest(n, iterable, key=None)h...

    Batkid 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<