成人无码视频,亚洲精品久久久久av无码,午夜精品久久久久久毛片,亚洲 中文字幕 日韩 无码

資訊專欄INFORMATION COLUMN

3 - collections 模塊

Gemini / 1307人閱讀

摘要:總結(jié)以上這些在日常使用的時(shí)候如果不了解,很少會(huì)去用到,但如果想寫出優(yōu)雅,簡(jiǎn)潔的代碼,這些概念會(huì)起到一定的幫助作用參考

collections 數(shù)據(jù)類型

collections 數(shù)據(jù)類型主要是為了彌補(bǔ) list /tuple / dict 的額外數(shù)據(jù)類型

ChainMap

代碼:

import collections
## 賦值,合并字典的作用
a = {"a":"A"}
b = {"b":"B"}

m = collections.ChainMap(a,b)
for k,v in m.items():
    print("key: {} | value:{}".format(k,v))

print(m)

如果字典中有重復(fù)的key值

a = {"a":"A","b":"B"}
b = {"b":"C"}
m2 = collections.ChainMap(a,b)
print(m2)

for k,v in m2.items():
    print("key: {} | value:{}".format(k,v))

輸出:

ChainMap({"a": "A", "b": "B"}, {"b": "C"})
key: a | value:A
key: b | value:B

結(jié)論:
結(jié)果是沒(méi)有合并,如果只是合并字典的值,還是直接使用update即可, 這個(gè)模塊不怎么會(huì)用到,了解即可

Counter

Counter 顧名思義,就是計(jì)算總數(shù)的意思,可以計(jì)算出一個(gè)序列中每個(gè)元素的個(gè)數(shù),一個(gè)簡(jiǎn)單的例子

>>> import collections
>>> collections.Counter("Hello World")
Counter({"l": 3, "o": 2, "H": 1, "e": 1, " ": 1, "W": 1, "r": 1, "d": 1})

可以使用如下的寫法,來(lái)得到自己想要的元素的個(gè)數(shù)

>>> a =  collections.Counter("Hello World")
>>> a["W"]
1

除此之外,Counter對(duì)象還支持直接運(yùn)算

import collections

c1 = collections.Counter("Hello World")
c2 = collections.Counter("Hello Python")

print("c1 + c2 =",c1 + c2)
print("c1 - c2 = ",c1 - c2)
print("c1 | c2 = ",c1 | c2)
print("c1 & c2 = ",c1 & c2)

輸出:

c1 + c2 = Counter({"l": 5, "o": 4, "H": 2, "e": 2, " ": 2, "W": 1, "r": 1, "d": 1, "P": 1, "y": 1, "t": 1, "h": 1, "n": 1})
c1 - c2 =  Counter({"l": 1, "W": 1, "r": 1, "d": 1})
c1 | c2 =  Counter({"l": 3, "o": 2, "H": 1, "e": 1, " ": 1, "W": 1, "r": 1, "d": 1, "P": 1, "y": 1, "t": 1, "h": 1, "n": 1})
c1 & c2 =  Counter({"l": 2, "o": 2, "H": 1, "e": 1, " ": 1})
defaultdict

眾所周知,當(dāng)需要獲取一個(gè)字典的值,可以使用 xx[key] 這樣的形式去獲取,如果key值不存在,那么就會(huì)拋出一個(gè)錯(cuò)誤,所以大部分推薦的做法是,使用 get 方法來(lái)獲取字典的值,比如:

test = {"a":"b"}
test.get("a")
# 如果獲取一個(gè)不存在的 key 值
test.get("b") # 返回None
# 但是通過(guò)get 可以指定一個(gè) key 值
test.get("b","this is b") # 返回 this is b

defaultdict 也差不多是這樣的道理,當(dāng)你獲取一個(gè)不存在的 key 值的時(shí)候,返回默認(rèn)值

import collections

def default_value():
    return "Default value"


m = collections.defaultdict(default_value,foo="aaa")
print(m["fxx"]) # 返回 Default value
deque

雙端隊(duì)列,元素可以從兩端彈出,插入和刪除操作限定在隊(duì)列的兩邊進(jìn)行

from collections import deque
d = deque("abcdefg")
print(d) # deque(["a", "b", "c", "d", "e", "f", "g"])
d.remove("c")
print(d) # deque(["a", "b", "d", "e", "f", "g"])
d.append("h")
print(d) #deque(["a", "b", "d", "e", "f", "g", "h"])
d.appendleft("1")
print(d) #deque(["1", "a", "b", "d", "e", "f", "g", "h"])
# 使用pop 獲取隊(duì)列中的值
d.pop()
print(d) # deque(["1", "a", "b", "d", "e", "f", "g"])
d.popleft()
print(d) # deque(["a", "b", "d", "e", "f", "g"])

也可以使用線程來(lái)消費(fèi)雙端隊(duì)列

from collections import deque
import time
import threading


# deque 也可以用線程通信
d1 = deque(range(1000))
def task(direction,i,nextSource):
    while True:
        try:
            item = nextSource()
            print("方向:{} 線程: {} 正在處理: {} ".format(direction,i,item))
        except IndexError as e:
            break
        else:
            time.sleep(1)
    

right_ts = [threading.Thread(target=task,args=("right",i,d1.pop))for i in range(10)]
left_ts = [threading.Thread(target=task,args=("left",i,d1.popleft)) for i in range(10)]

for tl in left_ts:
    tl.start()

for tr in right_ts:
    tr.start()

for tl in left_ts:
    tl.join()

for tr in right_ts:
    tr.join()
OrderedDict

使用字典的時(shí)候,其輸出時(shí),不一定按照當(dāng)時(shí)添加的順序輸出,例如:

d = {}
d["a"]= "A"
d["b"] = 3
d["c"]= 1
d["d"]="B"
d["c"]="C"
for k,v in d.items():
    print(k,"=>",v)

輸出:

a => A
b => 3
c => C
d => B

但是 OrderedDict 會(huì)

d = OrderedDict()
d["a"]= "A"
d["b"] = 3
d["s"]= 1
d["d"]="B"
d["c"]="C"
for k,v in d.items():
    print(k,"=>",v)

輸出:

a => A
b => 3
s => 1
d => B
c => C

當(dāng)需要使用dict 來(lái)作為運(yùn)算和存儲(chǔ)的時(shí)候,這就是一個(gè)比較有用的特點(diǎn)了。

總結(jié)

以上這些在日常使用的時(shí)候如果不了解,很少會(huì)去用到,但如果想寫出優(yōu)雅,簡(jiǎn)潔的代碼,這些概念會(huì)起到一定的幫助作用

參考

《The Python3 Standard Library By Example》

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://m.hztianpu.com/yun/42978.html

相關(guān)文章

  • 不可不知的python模塊--collections

    摘要:原生的也可以從頭部添加和取出對(duì)象就像這樣但是值得注意的是,對(duì)象的這兩種用法的時(shí)間復(fù)雜度是,也就是說(shuō)隨著元素?cái)?shù)量的增加耗時(shí)呈線性上升。 基本介紹 Python擁有一些內(nèi)置的數(shù)據(jù)類型,比如str, int, list, tuple, dict等, collections模塊在這些內(nèi)置數(shù)據(jù)類型的基礎(chǔ)上,提供了幾個(gè)額外的數(shù)據(jù)類型: namedtuple(): 生成可以使用名字來(lái)訪問(wèn)元素內(nèi)容的...

    韓冰 評(píng)論0 收藏0
  • node.js操作Mongodb數(shù)據(jù)庫(kù)

    摘要:接下去完成與本機(jī)上數(shù)據(jù)庫(kù)的連接,這是一個(gè)異步函數(shù),當(dāng)連接完成之后,觸發(fā)執(zhí)行其回調(diào)函數(shù),參數(shù)指代這個(gè)數(shù)據(jù)庫(kù)本身。同樣是在完成數(shù)據(jù)庫(kù)連接的回調(diào)函數(shù)當(dāng)中對(duì)這個(gè)對(duì)象進(jìn)行操作。當(dāng)完成修改操作之后觸發(fā)執(zhí)行其回調(diào)函數(shù),表示對(duì)修改結(jié)果的反饋。 一、node.js對(duì)于mongodb的基本操作 1、數(shù)據(jù)庫(kù)的開機(jī) 首先我們要先對(duì)數(shù)據(jù)庫(kù)進(jìn)行開機(jī)的操作,建立一個(gè)文件夾用于存放數(shù)據(jù)庫(kù)文檔。如D:mongo,接下去...

    SKYZACK 評(píng)論0 收藏0
  • Backbone源碼解讀(二)

    摘要:以為例構(gòu)造函數(shù)的內(nèi)容構(gòu)造函數(shù)的內(nèi)部一般會(huì)做以下幾個(gè)操作各種給內(nèi)部對(duì)象設(shè)置屬性。為什么呢源碼做出了解釋。在里面會(huì)調(diào)用用戶傳入的回調(diào)函數(shù)并觸發(fā)事件表示已經(jīng)同步了。整個(gè)的源碼事實(shí)上就是這兩組東西。 1. 開場(chǎng) 強(qiáng)烈建議一邊看著源碼一邊讀本文章,本文不貼大段代碼。源碼地址。在寫backbone應(yīng)用的時(shí)候,說(shuō)實(shí)話,大部分的時(shí)間都是在寫這三個(gè)模塊的內(nèi)容。關(guān)于這三個(gè)模塊的分析網(wǎng)上隨隨便便就能找到一堆...

    Sleepy 評(píng)論0 收藏0
  • JavaScript 是如何工作的:模塊的構(gòu)建以及對(duì)應(yīng)的打包工具

    摘要:掛機(jī)科了次使用這個(gè)結(jié)構(gòu),匿名函數(shù)就有了自己的執(zhí)行環(huán)境或閉包,然后我們立即執(zhí)行。注意,匿名函數(shù)的圓括號(hào)是必需的,因?yàn)橐躁P(guān)鍵字開頭的語(yǔ)句通常被認(rèn)為是函數(shù)聲明請(qǐng)記住,中不能使用未命名的函數(shù)聲明。 這是專門探索 JavaScript 及其所構(gòu)建的組件的系列文章的第 20 篇。 想閱讀更多優(yōu)質(zhì)文章請(qǐng)猛戳GitHub博客,一年百來(lái)篇優(yōu)質(zhì)文章等著你! 如果你錯(cuò)過(guò)了前面的章節(jié),可以在這里找到它們: ...

    hedzr 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

閱讀需要支付1元查看
<