91aaa在线国内观看,亚洲AV午夜福利精品一区二区,久久偷拍人视频,久久播这里有免费视播

<strong id="fvuar"></strong>

  • <sub id="fvuar"><dl id="fvuar"><em id="fvuar"></em></dl></sub>

    1. 千鋒教育-做有情懷、有良心、有品質(zhì)的職業(yè)教育機構(gòu)

      手機站
      千鋒教育

      千鋒學(xué)習(xí)站 | 隨時隨地免費學(xué)

      千鋒教育

      掃一掃進入千鋒手機站

      領(lǐng)取全套視頻
      千鋒教育

      關(guān)注千鋒學(xué)習(xí)站小程序
      隨時隨地免費學(xué)習(xí)課程

      當(dāng)前位置:首頁  >  技術(shù)干貨  > Python工具庫之collections

      Python工具庫之collections

      來源:千鋒教育
      發(fā)布人:xqq
      時間: 2023-11-07 12:54:22 1699332862

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

      defaultdict

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

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

      ifkeyindict:

      returndict[key]

      else:

      returnNone

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

      returndict.get(key,None)

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

      data=[(1,3),(2,1),(1,4),(2,5),(3,7)]

      d={}

      fork,vindata:

      ifkind:

      d[k].append(v)

      else:

      d[k]=[v]

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

      fork,vindata:

      cur=d.get(k,[])

      cur.append(v)

      d[k]=v

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

      fromcollectionsimportdefaultdict

      d=defaultdict(list)

      fork,vindata:

      d[k].append(v)

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

      d=defaultdict(lambda:3)

      fork,vindata:

      d[k]+=v

      Counter

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

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

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

      舉個例子:

      words=['apple','apple','pear','watermelon','pear','peach']

      fromcollectionsimportCounter

      counter=Counter(words)

      >>>print(counter)

      Counter({'apple':2,'pear':2,'watermelon':1,'peach':1})

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

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

      counter.most_common(1)

      [('apple',2)]

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

      c=Counter({'apple':5,'pear':4})

      c=Counter(apple=4,pear=3)

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

      deque

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

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

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

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

      fromcollectionsimportdeque

      dque=deque(maxlen=10)

      #假設(shè)我們想要從文件當(dāng)中獲取最后10條數(shù)據(jù)

      foriinf.read():

      dque.append(i)

      namedtuple

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

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

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

      classStudent:

      def__init__(self,name=None,score=None,age=None):

      self.name=name

      self.score=score

      self.age=age

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

      fromcollectionsimportnamedtuple

      #這個是類,columns也可以寫成'namescoreage',即用空格分開

      Student=namedtuple('Student',['name','score','age'])

      #這個是實例

      student=Student(name='xiaoming',score=99,age=10)

      print(student.name)

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

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

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

      以上內(nèi)容為大家介紹了Python工具庫之collections,希望對大家有所幫助,如果想要了解更多Python相關(guān)知識,請關(guān)注IT培訓(xùn)機構(gòu):千鋒教育。

      聲明:本站稿件版權(quán)均屬千鋒教育所有,未經(jīng)許可不得擅自轉(zhuǎn)載。
      10年以上業(yè)內(nèi)強師集結(jié),手把手帶你蛻變精英
      請您保持通訊暢通,專屬學(xué)習(xí)老師24小時內(nèi)將與您1V1溝通
      免費領(lǐng)取
      今日已有369人領(lǐng)取成功
      劉同學(xué) 138****2860 剛剛成功領(lǐng)取
      王同學(xué) 131****2015 剛剛成功領(lǐng)取
      張同學(xué) 133****4652 剛剛成功領(lǐng)取
      李同學(xué) 135****8607 剛剛成功領(lǐng)取
      楊同學(xué) 132****5667 剛剛成功領(lǐng)取
      岳同學(xué) 134****6652 剛剛成功領(lǐng)取
      梁同學(xué) 157****2950 剛剛成功領(lǐng)取
      劉同學(xué) 189****1015 剛剛成功領(lǐng)取
      張同學(xué) 155****4678 剛剛成功領(lǐng)取
      鄒同學(xué) 139****2907 剛剛成功領(lǐng)取
      董同學(xué) 138****2867 剛剛成功領(lǐng)取
      周同學(xué) 136****3602 剛剛成功領(lǐng)取
      相關(guān)推薦HOT