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

        共 2412字,需瀏覽 5分鐘

         ·

        2021-10-09 19:13

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

        今天就來說說最有用的幾個。

        1、deque

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

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

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

        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)檫@是一個雙端隊(duì)列,你可以在隊(duì)列的首位插入元素,也可以在首尾刪除元素,它們的時間復(fù)雜度都是 O(1):

        • append(x) ?在隊(duì)列尾部插入 x
        • appendleft(x) 在隊(duì)列頭部插入 x
        • pop() 在隊(duì)列尾部刪除一個元素,并返回
        • popleft() 在隊(duì)列頭部刪除一個元素,并返回
        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

        這個庫提供了命名的元組,可以通過指定的名稱來訪問,例如:

        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ù)把第一個參數(shù)作為新元組的名稱,第二個參數(shù)就是元組內(nèi)元素的名稱映射,可以是一個字符串列表,也可以是空格或逗號分割的字符串。

        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 來設(shè)置默認(rèn)值:

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

        如果你定義了三個名稱,卻提供了兩個默認(rèn)值,那么只有最后兩個會被賦予默認(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ì)列表或可迭代對象中元素的數(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)頻率最高的兩個元素:

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

        還可以動態(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 是簡單和快捷的。

        最后

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


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

        手機(jī)掃一掃分享

        分享
        舉報
        評論
        圖片
        表情
        推薦
        點(diǎn)贊
        評論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報
          
          

            1. 自拍 亚洲 女优 欧美 偷拍 | 91精品久久久久久综合五月天 | 成人做爱在线W视频 | 日本一区二区三区乱伦 | 欧美激情第1页 |