摘要:提供了大量的內置數據結構,包括列表,集合以及字典。這個問題很簡單,我的第一反應是循環求和,然后計算平均值,顯然很麻煩。這時候就該登場了,它的作用是可以使鍵和值反轉過來。
文章首發于知乎專欄,歡迎關注。
https://zhuanlan.zhihu.com/py...
以下測試代碼全部基于 Python3。
Python 提供了大量的內置數據結構,包括列表,集合以及字典。在工作和編碼中,可以說天天和它們打交道,經常碰到查詢,排序和過濾等等這些問題,雖然每次解決這些問題并不困難,但總感覺代碼寫的很麻煩,不夠優雅。
最近通過閱讀《Python3 CookBook》,了解了一些更優秀的方法,做一些簡單記錄,與大家分享。
1、解壓可迭代對象賦值給多個變量我們都知道,一個序列是可以賦值給多個變量的,就像下面這樣:
In [7]: p = (1, 2, 3) In [8]: x, y, z = p In [9]: x Out[9]: 1
但如果接收的變量個數和序列元素個數不一致,就會報錯,如果你不知道元素個數的話,可以采用下面這樣的方式:
In [10]: x, *y = p In [11]: y Out[11]: [2, 3]
通過這種星號的方式,就可以解壓不確定個數或任意個數的可迭代對象了,是不是很棒呢?
那么,用這個方法可以解決哪些問題呢?
先來看一種情況,現在有一個序列,去掉第一個數和最后一個數,然后求剩下數的平均值。
這個問題很簡單,我的第一反應是循環求和,然后計算平均值,顯然很麻煩。這時候星號表達式就派上用場了:
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 個元素
這個問題也是經常會遇到的,比如只取文件中滿足要求的前五行,或者只返回滿足要求的最新十條數據。我的第一反應是列表,然后通過 push 和 pop 來操作列表來實現。
其實通過 collections.deque 可以很容易解決這個問題,使用 deque(maxlen=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])
如果沒有設置 maxlen 則是一個無限大小的隊列,可以通過 appendleft 和 pop 在隊首和隊尾添加刪除元素。
3、字典中的鍵映射多個值現在有一個需求,構建一個字典,key 是用戶 ID,value 為一個列表,列表元素可以是名字,電話等等,大概是這樣:
d = {"id": ["name", "phone"]}
如果我們自己構建這個字典,可能會像下面這樣來實現:
d = {} for key, value in items: if key not in d: d[key] = value d[key].append(value)
很麻煩,如果使用 collections 的 defaultdict 就很簡單了。defaultdict 的一個特征就是它會自動初始化每個 key 剛開始對應的值,所以我們只關注添加元素操作就可以了。
優化后代碼就變成了這樣:
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 內部維護這一個根據鍵插入順序排序的雙向鏈表。每次新元素插入時,便會被放在鏈表尾部,對于已經存在的鍵,并不會改變鍵的順序。
但需要注意的是,OrderedDict 的大小是普通字典的兩倍,所以在構建一個需要大量 OrderedDict 實例的數據結構時,就要考慮大量內存消耗的影響了。
5、字典的運算如何取出字典中的最小值,或者對字典進行排序呢?
首先我們來看看直接使用普通的數學運算函數
In [25]: d = {"a": 11, "b": 43, "c": 3, "d": 65} In [26]: min(d) Out[26]: "a"
它比較的邏輯是直接比較 key,然后取出對應的 key,但如果要比較 value 呢?
In [28]: min(d.values()) Out[28]: 3
結果是正確的,但似乎并不完美,如果鍵值一起返回就完美了。這時候就該 zip 登場了,它的作用是可以使鍵和值反轉過來。
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")]
先寫這么多吧,未完待續。。。
歡迎留言,或者添加我個人微信 zhangyx6a 交流溝通,不是微商。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/44513.html
摘要:以下測試代碼全部基于查找最大或最小的個元素工作中有時會遇到這樣的需求,取出數據中前面的值,或者最后的值。大家如果對堆數據結構感興趣的話,可以繼續進行深入研究,由于我了解的并不深,也沒辦法再展開了。 文章首發于知乎專欄,歡迎關注。https://zhuanlan.zhihu.com/py... 以下測試代碼全部基于 Python3 1、查找最大或最小的 N 個元素 工作中有時會遇到這樣的...
摘要:整個過程還是比較清晰的,關鍵是要理解的工作方式,而不是想當然地認為調用了父類的方法。小結事實上,和父類沒有實質性的關聯。 super() 的入門使用 在類的繼承中,如果重定義某個方法,該方法會覆蓋父類的同名方法,但有時,我們希望能同時實現父類的功能,這時,我們就需要調用父類的方法了,可通過使用 super 來實現,比如: class Animal(object): def __...
摘要:鏈接中文翻譯常用庫推薦除了上面提到的之外,也是一個很好的選項。官網中文翻譯如果你要編寫簡單的爬蟲,來爬去互聯網上的信息,或者調用一些外部的機遇的接口,使用這個庫再也合適不過了。 作者:安龍 LeanCloud 工程師 引言 :前段時間有同學反映 Python 的學習資源匯總很少。那么學習資料哪個質量更好,效率更高?Python 有哪些非常值得學習的庫?2017 年了學 2 還是學 3 ...
摘要:的三種數據類型字典列表元組,分別用花括號中括號小括號表示。約等于上句,可能是因為自定義變量名與內部函數或變量同名了。下,默認路徑一般為。的日志模塊中計時器定時器計劃任務,。對象的問題怎樣忽略警告不打印煩人的警告打印到終端同時記錄到文件。 Python Enhancement Proposal。(PEP,Python增強建議書) Python之禪(import this) Pytho...
摘要:問題在某個集合中找到最大或最小的個元素解決方案使用模塊例如此外,這兩個函數都可以接受作為參數,例如輸出為討論根據官方文檔對的介紹可以了解到提供了堆數據結構的實現,并且實現方式是小頂堆,也就是說每次的時候取出的是最小的元素首先使用將一個列 問題 在某個集合中找到最大或最小的N個元素 解決方案 使用heapq模塊 heapq.nlargest(n, iterable, key=None)h...
閱讀 2516·2021-09-26 10:18
閱讀 3394·2021-09-22 10:02
閱讀 3190·2019-08-30 15:44
閱讀 3329·2019-08-30 15:44
閱讀 1836·2019-08-29 15:25
閱讀 2580·2019-08-26 14:04
閱讀 2042·2019-08-26 12:15
閱讀 2442·2019-08-26 11:43