溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Python內(nèi)置數(shù)據(jù)結(jié)構(gòu)——字典dict

發(fā)布時(shí)間:2020-07-14 05:36:38 來源:網(wǎng)絡(luò) 閱讀:426 作者:AiSmile 欄目:編程語言

字典dict

key-value 鍵值對(duì)的數(shù)據(jù)的集合

可變的,無序的,key不重復(fù),可迭代


字典dict定義 初始化

  • d = dict() 或者 d = {}

  • dict(**kwargs)使用name = value對(duì) 初始化一個(gè)字典

  • dict(iterable,**kwarg)使用可迭代對(duì)象的name = value對(duì) 構(gòu)造字典,不過可迭代對(duì)象的元素必須是一個(gè)二元結(jié)構(gòu)

  •             d = dict(((1,"a"), (2,'b'))) 或者 dict(([1,"2"],[2,"b"]))

  • dict(mapping,kwarg) 使用一個(gè)字典構(gòu)建另一個(gè)字典

  • d ={'a' : 10 , "b" : 20, "c" : None, 'd' : [1,2,3]}

  • 類方法dict.fromkeys(iterable , value)

  d = dict.fromkeys(range(5))    ->    {0: None, 1: None, 2: None, 3: None, 4: None}
  d = dict.fromkeys(rang(5),0)    ->    {0: 0, 1: 0, 2: 0, 3: 0, 4: 0}

字典元素的訪問

  • dict[key]

            返回key對(duì)應(yīng)的值value

            key不存在拋出KeyError異常

  • dict.get(key[,default])

            返回key對(duì)應(yīng)的值value

            key不存在返回缺省值,如果沒有設(shè)置缺省值就返回None

  • dict.setdefault(key[,default])

            返回key對(duì)應(yīng)的值value

            key不存在,添加k=v對(duì),value設(shè)置為default,并返回default,如果default沒有設(shè)置,缺省為None

字典增加和修改

  • dict[key] = value

            將key對(duì)應(yīng)的值修改為value

            key不存在將添加新的k=v對(duì)

  • dict.update([other]) -> None

            使用另個(gè)字典的kv 對(duì)更新本字典

            key不存在,就添加

            key存在,覆蓋已經(jīng)存在的key對(duì)應(yīng)的值

            就地修改

d.update(red = 1)
d.update((('red' , 2),))
d.update({'red' : 3})

字典刪除

  • dict.pop(key [, default])

            key存在,移除它,并返回它的value

            key不存在,返回給定的default

            default未設(shè)置,key不存在則拋出keyError

  • dict.popitem()

            移除并返回一個(gè)任意的鍵值對(duì)

            字典為empty,拋出KeyError異常

  • dict.clear()

            清空字典

del 語句

 a = True
 b = [6]
 d = {'a':1,'b':b,'c':[1,3,4]}
 del a
 del d['c'] # 并沒有刪除對(duì)象[1,3,4],只是他的引用次數(shù)減一了
 del b[0] # b這個(gè)變量之前已經(jīng)被del掉

#del d['c'] 看著像刪除了一個(gè)對(duì)象,本質(zhì)上減少了一對(duì)象的引用,del實(shí)際上刪除的是名稱,而不是對(duì)象


字典遍歷

for ... in dict:

遍歷key

for k in d:
    print(k)
    
for k in d.keys():
    print(k)

遍歷value

for k in d:
    print(d[k])
    
for k in d.keys():
    print(d.get(k))
    
for v in d.values():
    print(v)

遍歷item,即k=v對(duì)

for item in d.items():  -> 返回有2個(gè)元素的元組tuple
    print(item)
    
for item in d.items():
    print(item[0],item[1])
    
for k,v in d.items():
    print(k,v)

字典遍歷總結(jié)

  • python3 中,keys  values items方法返回一個(gè)類似一個(gè)生成器的可迭代對(duì)象,不會(huì)把函數(shù)的返回結(jié)果復(fù)制到內(nèi)存中(不重復(fù)占用內(nèi)存)

  • Dictionary view對(duì)象,可以使用len().iter(),in操作

  • 字典的entry的動(dòng)態(tài)的視圖,字典變化,視圖反映出這些變化

  • keys返回一個(gè)類set對(duì)象,也就是可以看做一個(gè)set集合.如果values都可以hash,那么items也可以看做是類set對(duì)象

[了解]python2 中,上面的方法會(huì)返回一個(gè)新的列表,占據(jù)新的內(nèi)存空間.所以Python2 建議使用iterkeys,itervalues,iteritems版本,返回一個(gè)迭代器,而不是返回一個(gè)copy


字典遍歷和移除   

如何在遍歷的時(shí)候移除元素

正確的做法:

d = dict(a =1,b = 2,c = 'abc')
keys = []
for k,v in d.items():
    if isinstance(v,str)
        keys.append(k) 創(chuàng)建一個(gè)k的列表
for k in keys:
    d.pop(k) # 移除c
print(d)

out:{'a': 1, 'b': 2}

錯(cuò)誤的做法:

d = dict(a =1,b = 2,c = 'abc')
for k,v in d.items():
    d.pop(k) #異常( dictionary changed size during iteration)
    
while len(d): # 相當(dāng)于清空,不如直接celar
    print(d.popitem())
    
while d:
    print(d.popitem())

字典的key

  • key的要求和set 的元素要求一致

  • set 的元素就可以看做key , set 可以看做dict 的簡化版

  • hashable 可哈希才可以作為key,使用hash()測試

  • d = {1:0 , 2.0:3 , "abc":None , ('hello' , 'world' , 'python'):'string' , b'abc' : '135'}

defaultdict

  • collections.defaultdict([default_factory[, ...]])

            第一個(gè)參數(shù)是default_factiory,缺省的是None,它提供一個(gè)初始化函數(shù)..當(dāng)key不存在的時(shí)候,會(huì)調(diào)用這個(gè)工廠函數(shù)來生成Key對(duì)應(yīng)的value

import random
d1 = {}
for k in 'abcdef':
    for i in range(random.randint(1,5)):
        if k not in d1.keys():
            d1[k] = [] # d1 內(nèi)增加key:[]
        d1[k].append(i) # key對(duì)應(yīng)的value添加值
print(d1)

from collections import defaultdict
import random
d1 = defaultdict(list)
    for k in 'abcdef':
        for i in range(random.randint(1,5)):
            d1[k].append(i)
print(d1)


OrderedDict

  • collections.OrderedDict([items])

            key并不是按照加入的順序排列,可以使用OrderedDict記錄順序

            有序字典可以記錄元素插入的順序,打印的時(shí)候也是按照這個(gè)順序輸出打印

  • 應(yīng)用場景

            加入使用了字典記錄了N個(gè)產(chǎn)品,這些產(chǎn)品使用ID由小到大加入到字典中

            除了使用字典檢索的遍歷,有時(shí)候需要去除 ID, 但是希望是按照輸入的順序,因?yàn)檩斎腠樞蚴怯行虻?/p>

            否則還需要重新把遍歷到的值排序


向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請(qǐng)聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI