激情久久久_欧美视频区_成人av免费_不卡视频一二三区_欧美精品在欧美一区二区少妇_欧美一区二区三区的

腳本之家,腳本語言編程技術(shù)及教程分享平臺!
分類導航

Python|VBS|Ruby|Lua|perl|VBA|Golang|PowerShell|Erlang|autoit|Dos|bat|

服務器之家 - 腳本之家 - Python - 詳細分析Python collections工具庫

詳細分析Python collections工具庫

2020-07-17 15:45TechFlow2019 Python

這篇文章主要介紹了詳解Python collections工具庫的相關(guān)資料,文中講解非常細致,代碼幫助大家更好的理解和學習,感興趣的朋友可以了解下

今天為大家介紹Python當中一個很好用也是很基礎(chǔ)的工具庫,叫做collections

collection在英文當中有容器的意思,所以顧名思義,這是一個容器的集合。這個庫當中的容器很多,有一些不是很常用,本篇文章選擇了其中最常用的幾個,一起介紹給大家。

defaultdict

defaultdict可以說是這個庫當中使用最簡單的一個,并且它的定義也很簡單,我們從名稱基本上就能看得出來。它解決的是我們使用dict當中最常見的問題,就是key為空的情況。

在正常情況下,我們在dict中獲取元素的時候,都需要考慮key為空的情況。如果不考慮這點,那么當我們獲取了一個不存在的key,會導致系統(tǒng)拋出異常。我們當然可以在每次get之前寫一個if判斷,但是這很麻煩,比如:

?
1
2
3
4
if key in dict:
  return dict[key]
else:
  return None

當然,這是最笨的方法,dict當中為我們提供了帶默認值的get方法。比如,我們可以寫成:

?
1
return dict.get(key, None)

這樣,當key不在dict當中存在的時候,會自動返回我們設(shè)置的默認值。這個省去了很多麻煩的判斷,但是在一些特殊情況下仍然存在一點問題。舉個例子,比如當key存在重復,我們希望將key相同的value存進一個list當中,而不是只保留一個。這種情況下寫成代碼就會比較復雜:

?
1
2
3
4
5
6
7
data = [(1, 3), (2, 1), (1, 4), (2, 5), (3, 7)]
d = {}
for k, v in data:
  if k in d:
    d[k].append(v)
  else:
    d[k] = [v]

由于dict的value是一個list,所以我們還是需要判斷是否為空,不能直接使用默認值,間接操作當然可以,但是還是不夠簡單:

?
1
2
3
4
for k, v in data:
  cur = d.get(k, [])
  cur.append(v)
  d[k] = v

這和使用if區(qū)別并不大,為了完美解決這個問題,我們可以使用collections當中的defaultdict:

?
1
2
3
4
5
from collections import defaultdict
d = defaultdict(list)
 
for k, v in data:
  d[k].append(v)

使用defaultdict之后,如果key不存在,容器會自動返回我們預先設(shè)置的默認值。需要注意的是defaultdict傳入的默認值可以是一個類型也可以是一個方法。如果我們傳入int,那么默認值會被設(shè)置成int()的結(jié)果,也就是0,如果我們想要自定義或者修改,我們可以傳入一個方法,比如:

?
1
2
3
4
d = defaultdict(lambda: 3)
 
for k, v in data:
  d[k] += v

Counter

這是一個非常常用和非常強大的工具,我們經(jīng)常用到。

在我們實際的編程當中,我們經(jīng)常遇到一個問題,就是數(shù)數(shù)和排序。比如說我們在分析文本的時候,會得到一堆單詞。其中可能有大量的長尾詞,在整個文本當中可能只出現(xiàn)過寥寥幾次。于是我們希望計算一下這些單詞出現(xiàn)過的數(shù)量,只保留出現(xiàn)次數(shù)最高的若干個。

這個需求讓我們自己實現(xiàn)當然也不困難,我們完全可以創(chuàng)建一個dict,然后對這些單詞一個一個遍歷。原本我們還需要考慮單詞之前沒有出現(xiàn)過的情況,如果我們上面說的defaultdict,又要簡單許多。但是我們還是少不了計數(shù)然后排序的步驟,如果使用Counter這個步驟會縮減成一行代碼。

舉個例子:

?
1
2
3
4
5
6
7
words = ['apple', 'apple', 'pear', 'watermelon', 'pear', 'peach']
from collections import Counter
counter = Counter(words)
 
>>> print(counter)
 
Counter({'apple': 2, 'pear': 2, 'watermelon': 1, 'peach': 1})

我們直接將一個list傳入Counter中作為參數(shù),它會自動為我們替當中的每個元素計數(shù)。

如果我們要篩選topK,也非常簡單,它為我們提供了most_common方法,我們只需要傳入需要求的K即可:

?
1
2
3
counter.most_common(1)
 
[('apple', 2)]

除此之外,它的構(gòu)造函數(shù)還接收dict類型。我們可以直接通過一個value是int類型的dict來初始化一個Counter,比如:

?
1
2
c = Counter({'apple': 5, 'pear': 4})
c = Counter(apple=4, pear=3)

并且,它還支持加減法的操作,比如我們可以將兩個Counter相加,它會自動將兩個Counter合并,相同的key對應的value累加。相減也是同理,會將能對應的value做減法,被減的key對應不上的會保留,而減數(shù)中對應不上的key則會被丟棄。并且需要注意,Counter支持value為負數(shù)。

deque

我們都知道queue是隊列,deque也是隊列,不過稍稍特殊一些,是雙端隊列。對于queue來說,只允許在隊尾插入元素,在隊首彈出元素。而deque既然稱為雙端隊列,那么說明它的隊首和隊尾都支持元素的插入和彈出。相比于普通的隊列,要更加靈活一些。

除了常用的clear、copy、count、extend等api之外,deque當中最常用也是最核心的api還有append、pop、appendleft和popleft。從名字上我們就看得出來,append和pop和list的append和pop一樣,而appendleft和popleft則是在隊列左側(cè),也就是頭部進行pop和append的操作。非常容易理解。

在日常的使用當中,真正用到雙端隊列的算法其實不太多。大多數(shù)情況下我們使用deque主要有兩個原因,第一個原因是deque收到GIL的管理,它是線程安全的。而list則沒有GIL鎖,因此不是線程安全的。也就是說在并發(fā)場景下,list可能會導致一致性問題,而deque不會。另一個原因是deque支持固定長度,當長度滿了之后,當我們繼續(xù)append時,它會自動彈出最早插入的數(shù)據(jù)。

比如說當我們擁有海量的數(shù)據(jù),我們不知道它的數(shù)量,但是想要保留最后出現(xiàn)的指定數(shù)量的數(shù)據(jù)的時候,就可以使用deque。

?
1
2
3
4
5
from collections import deque
dque = deque(maxlen=10)
# 假設(shè)我們想要從文件當中獲取最后10條數(shù)據(jù)
for i in f.read():
  dque.append(i)

namedtuple

namedtuple很特殊,它涉及到元編程的概念。簡單介紹一下元編程的概念,我們不做過多的深入。簡而言之,就是在常見的面向?qū)ο螽斨小N覀兌际嵌x類,然后通過類的構(gòu)造函數(shù)來創(chuàng)建實例。而元編程指的是我們定義元類,根據(jù)元類創(chuàng)建出來的并不是一個實例,而是一個類。如果用模具和成品來分別比喻類和實例的話,元類相當于是模具的模具。

namedtuple是一個非常簡單的元類,通過它我們可以非常方便地定義我們想要的類。

它的用法很簡單,我們直接來看例子。比如如果我們想要定義一個學生類,這個類當中有name、score、age這三個字段,那么這個類會寫成:

?
1
2
3
4
5
class Student:
  def __init__(self, name=None, score=None, age=None):
    self.name = name
    self.score = score
    self.age = age

這還只是粗略的寫法,如果考慮規(guī)范,還需要定義property等注解,又需要很多代碼。如果我們使用namedtuple可以簡化這個工作,我們來看代碼:

?
1
2
3
4
5
6
7
from collections import namedtuple
# 這個是類,columns也可以寫成'name score age',即用空格分開
Student = namedtuple('Student', ['name', 'score', 'age'])
 
# 這個是實例
student = Student(name='xiaoming', score=99, age=10)
print(student.name)

通過使用namedtuple,我們只需要一行就定義了一個類,但是這樣定義的類是沒有缺失值的,但是namedtuple很強大,我們可以通過傳入defaults參數(shù)來定義缺失值。

?
1
Student = namedtuple('Student', ['name', 'score', 'age'], defaults=(0, 0))

可以注意到,雖然我們定義了三個字段,但是我們只設(shè)置了兩個缺失值。在這種情況下,namedtuple會自動將缺失值匹配上score和age兩個字段。因為在Python的規(guī)范當中,必選參數(shù)一定在可選參數(shù)前面。所以nuamdtuple會自動右對齊。

細數(shù)一下,我們今天的文章當中介紹了defaultdict、Counter、deque和namedtuple這四種數(shù)據(jù)結(jié)構(gòu)的用法。除了這四個之外,collections庫當中還有一些其他的工具類,只是我們用的頻率稍稍低一些,加上由于篇幅的原因,這里就不多做贅述了。感興趣的同學可以自行查看相關(guān)的api和文檔。

以上就是詳細分析Python collections工具庫的詳細內(nèi)容,更多關(guān)于Python collections工具庫的資料請關(guān)注服務器之家其它相關(guān)文章!

原文鏈接:https://www.cnblogs.com/techflow/p/12400482.html

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 国产精品久久久久av | 精品亚洲夜色av98在线观看 | 精品国产乱码久久久久久丨区2区 | 中国的免费的视频 | 国产精品久久久久国产精品三级 | 亚洲一区在线国产 | av观看国产 | 少妇的肉体2无删减版 | 中文字幕在线看第二 | 免费高潮在线国 | 精品在线免费播放 | 91久久久久久久久久久久久 | 欧美视频网 | 欧美特黄一级视频 | 欧美久久久一区二区三区 | 久久亚洲精品久久国产一区二区 | 中国女人内谢8xxxxxx在 | 99久久婷婷国产综合精品青牛牛 | 久久精品亚洲一区 | 女人叉开腿让男人桶 | 久久久久成人免费 | 欧产日产国产精品v | 精品一区二区三区免费视频 | 中文字幕在线观看视频一区 | 未成年人在线观看 | 91高清视频在线免费观看 | 最新一区二区三区 | av在线官网 | 国产一区二区三区四区五区精品 | 国产一及毛片 | 国产九九 | 久久免费观看一级毛片 | 国产在线午夜 | www久久艹 | 久久成人免费观看 | 精品一区二区6 | 视频一区二区在线播放 | 中国美女一级黄色大片 | 日韩精品a在线观看 | 精品成人av一区二区在线播放 | 成人不卡免费视频 |