<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          標(biāo)準(zhǔn)庫(kù) collections 中 4 個(gè)常用的數(shù)據(jù)結(jié)構(gòu)

          共 2412字,需瀏覽 5分鐘

           ·

          2021-10-09 19:13

          collections 庫(kù)是標(biāo)準(zhǔn)庫(kù)的一部分,里面有很多數(shù)據(jù)結(jié)構(gòu),在列表、字典、元組的基礎(chǔ)上做了很多修改和提升。

          今天就來(lái)說(shuō)說(shuō)最有用的幾個(gè)。

          1、deque

          它實(shí)現(xiàn)了兩端都可以操作的隊(duì)列,相當(dāng)于雙端隊(duì)列,與可以指定最多存儲(chǔ)多少個(gè)元素,與 Python 的基本數(shù)據(jù)類型列表很相似。

          from?collections?import?deque
          a?=?deque(maxlen=3)

          上述代碼定義了大小為 3 的雙端隊(duì)列,當(dāng)你插入第 4 個(gè)元素時(shí),隊(duì)列的第一個(gè)元素會(huì)被刪除。

          a?=?deque(maxlen=3)
          a.append(1)?#?a?=?[1]
          a.append(2)?#?a?=?[1,?2]
          a.append(3)?#?a?=?[1,?2,?3]?FULL
          a.append(4)?#?a?=?[2,3,4]

          因?yàn)檫@是一個(gè)雙端隊(duì)列,你可以在隊(duì)列的首位插入元素,也可以在首尾刪除元素,它們的時(shí)間復(fù)雜度都是 O(1):

          • append(x) ?在隊(duì)列尾部插入 x
          • appendleft(x) 在隊(duì)列頭部插入 x
          • pop() 在隊(duì)列尾部刪除一個(gè)元素,并返回
          • popleft() 在隊(duì)列頭部刪除一個(gè)元素,并返回
          a?=?deque(maxlen?=?10)
          a.append(1)?#?a?=?[1]
          a.append(2)?#?a?=?[1,?2]?在隊(duì)列尾部插入?2
          a.appendleft(3)#?a?=?[3,?1,?2]?在隊(duì)列頭部插入?3
          x?=?a.pop()?#?a?=?[3,?1],?x?=?2?刪除隊(duì)列尾部元素?2
          y?=?a.popleft()?#?a?=?[1],?y?=?3?刪除隊(duì)列頭部元素?3

          2、namedtuple

          這個(gè)庫(kù)提供了命名的元組,可以通過(guò)指定的名稱來(lái)訪問(wèn),例如:

          from?collections?import?namedtuple
          Point?=?namedtuple("Point",?['x','y','z'])
          p?=?Point(3,4,5)
          print(p.x,?p.y,?p.z)?#Output:?3,?4,?5

          namedtuple 函數(shù)把第一個(gè)參數(shù)作為新元組的名稱,第二個(gè)參數(shù)就是元組內(nèi)元素的名稱映射,可以是一個(gè)字符串列表,也可以是空格或逗號(hào)分割的字符串。

          Point?=?namedtuple("Point",?"x?y?z")
          Point?=?namedtuple("Point",?"x,y,z")

          也可以這樣初始化,非常靈活:

          p1?=?Point(3,4,5)
          p2?=?Point(x=3,?y=4,?z=5)
          p3?=?Point._make([3,4,5])

          還可以使用 namedtuple 來(lái)設(shè)置默認(rèn)值:

          PointDef?=?namedtuple("PointDef",?"x,?y,?z",?defaults?=?[0,0,0])
          p?=?PointDef(x=1)?#?p?is?(1,0,0)

          如果你定義了三個(gè)名稱,卻提供了兩個(gè)默認(rèn)值,那么只有最后兩個(gè)會(huì)被賦予默認(rèn)值:

          Point?=?namedtuple("Point",?"x?y?z",defaults?="[0,?0])
          print(Point._field_defaults)
          #?output:?{“y”:?0,?“z”:?0}

          3、Counter

          計(jì)數(shù)器 Counter 非常有用,尤其當(dāng)你需要統(tǒng)計(jì)列表或可迭代對(duì)象中元素的數(shù)量時(shí):

          from?collections?import?Counter
          c?=?Counter(“aaabbccdaaa”)
          print(c)
          #Output:?Counter({'a':?6,?'b':?2,?'c':?2,?'d':?1})

          還可以方便的統(tǒng)計(jì)頻率前幾大,比如統(tǒng)計(jì)出現(xiàn)頻率最高的兩個(gè)元素:

          print(c.most_common(2))
          #output:?[('a',?6),?('b',?2)]

          還可以動(dòng)態(tài)增刪字符串,然后統(tǒng)計(jì):

          c?=?Counter("abbc")?#?{"a":1,?"b":2,?"c":1}
          c.update("bccd")?#?{"a":1,?"b":3,?"c":3,?"d":1}
          c.subtract("bbc")?#?{"a":1,?"b":1,?"c":2,?"d":1}

          4、defaultdict

          defaultdict 和 dict 差不多,但是可以提供 dict 的 values 的默認(rèn)數(shù)據(jù)類型,比如:

          from?collections?import?defaultdict
          toAdd?=[("key1",?3),?("key2",?5),?("key3",?6),?("key2",?7)]
          d?=?defaultdict(list)
          for?key,?val?in?toAdd:
          ??d[key].append(val)
          print(d)?#?{"key1":[3],?"key2":[5,?7],?"key3":[6]}

          如果你用 dict,可能要這樣寫:

          d?=?dict()
          for?key,?val?in?toAdd:
          ??if?key?in?d:
          ????d[key].append(val)
          ??else:
          ????d[key]?=?[val]

          或者是這樣的:

          d?=?dict()
          for?key,?val?in?toAdd:
          ??d.setdefault(key,?[]).append(val)

          總之,defaultdict 是簡(jiǎn)單和快捷的。

          最后

          本文分享了 4 個(gè) collections 庫(kù)中常用的幾個(gè)數(shù)據(jù)結(jié)果,如果對(duì)你有所幫助,還請(qǐng)點(diǎn)贊關(guān)注支持:


          瀏覽 19
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  肏屄在线观看 | 嫩草成人| 伊人久久大香 | 高清无码成人电影 | 一级操逼电影 |