字典dict
- 字典是一個非線性結構,是key-value組成的鍵值對的資料集合。
- 字典的特點:可變的、無序的、key不重複。
字典的定義
- 【{}或者dict()】可以定義一個空字典
- 例如:
a = dict()
b = {}
print(a,b,type(a),type(b))
- 【dict(**kwargs)】可以使用name=value鍵值對,初始化一個字典
- 例如:
c = dict(gdy="abc",x=90,y=100)
print(c,type(c))
- 【dict(iterable,**kwarg)】使用可疊代對象和name = value度構造字典、不過可疊代對象的元素必須是一個二進制結構
- 例如:
d = dict((("a","001"),("b","002")))
print(d,type(d))
- 【dict(mapping,**kwarg)】使用一個字典建構另一個字典
- 例如:
e = {"a":10,"b":20,"c":30}
f = dict(e,abc="20")
print(e,f)
- 【{}】直接定義:例如:e = {“a”:10,“b”:20,“c”:30}
- fromkeys(iterable,value) 【類方法】 #根據建集合初始化一個字典
- iterable :為可疊代的鍵值集合
- value:為預設所有建對應的預設值。(可以不寫,如果沒有預設為None)
- 例如:
a = dict.fromkeys(range(10),0)
b = dict.fromkeys(range(10))
print(a)
print(b)
字典元素的通路
- 【d[key]】 傳回可用對應的值value,如果可以不存在會抛出keyError異常
- 【get(key[,default])】 傳回key對應的值value,如果key不存在就傳回預設值default,缺失值預設為None
- 【setdefault(key[,default])】傳回key對應的值value,如果key不存在,添加kv對,value設定為default,并傳回default,如果default沒有設定,則傳回None
- 【keys()】擷取字典中所有key的集合
- 【values()】或者字典中所有值values的集合
- 【items()】擷取字典中所有鍵值對組成的集合
字典增加和修改
- 【d[key] = value】将key對象的值修改為value,如果key不存在就添加新的key對應value
- 【update([other])—>None】 使用一個字典裡面的資料對本字典的更新,如果key不存在就添加,key存在就覆寫已經存在的key對應的值。 就地修改,無傳回值
- 例如:
a = {"1":10,"2":100,"3":200,"b":10,"c":20}
print(a)
a.update(b=100) #更新鍵值為b的值為100
print(a)
a.update([("1","ab")]) #将鍵值"1"的值修改為"ab"
print(a)
c = a.setdefault(1,5) #擷取鍵值為1對應的value的值,如果沒有就插入鍵值對1,5 ,并傳回預設值
c2 = a.setdefault(1,6) #擷取鍵值為1對應的value的值,如果沒有就插入鍵值對1,6,濱傳回預設值
print(a,c,c2)
a.update([(1,2)]) #将鍵值對key=1的值修改為2,如果沒有找到鍵值為1,就添加鍵值對1,2
print(a)
a.update([(1,5)]) #将鍵值為1對應的值修改為5
print(a)
字典的删除
- 【pop(key[,default])】 将key對應的值删除,并傳回key對應的值。如果key不存在就傳回預設值defalut。如果未設定default,并且key不存在會抛出異常keyError
- 【popitem()】移除并傳回任意的鍵值對,字典為empty空時會抛出異常KeyError
- 【clear()】清空字典
- 【del d[key]】 删除指定key的鍵值對
- 相關參數 del語句
- 例如【del a[‘c’]】看着像删除了一個對象,本質上減少了一個對象的引用,del實際上删除的是名稱,而不是對象。
a = True
b = [1,2]
c = [b,3]
print(a,b,c)
del a #将變量a的名稱删除
#print(a) #會報錯,因為變量a已經不存在
del b #将變量b的名稱删除
print(c)
字典的周遊
-
list(d.keys()) 根據字典的建集合或對應的list集合
注意:【for i in a.keys() 】等價于【for i in a】或者直接使用如下方法直接周遊出元素和元組
【for i,k in a.items()】
- 例如:
a = dict(a=1,b=2,c=3,d=4,e=5)
print(a.keys())
b = list(a.keys())
print(b)
for i in a.keys(): print(i) #列印所有key的值
print("-----------------")
for k in a : print(k)
總結
- python3中 keys、values、items方法傳回一個類似生成器的可疊代對象,不會吧函數的傳回結果複制到記憶體中,傳回的對象可以使用len()、iter()、in操作
- 傳回Dictionary view對象,可以使用len()、iter()、in操作
- 字典的entry的動态視圖,字典變化,視圖将反映出這些變化
- keys傳回一個類set對象,也就是可以看做一個set集合
- 如果values都可以hash,那麼items也可以看做是類set對象
- python2中上述方法傳回的是一個新清單,占用新的記憶體空間。是以Python2建議使用iterkeys、itervalues、iteritems版本,傳回一個疊代器,而不是傳回一個copy
相關字典
預設字典(defaultdict)
- 需要導入子產品import collections
- 定義方式:
import collections
defdict = collections.defaultdict(dict) #建立一個預設值為dict的預設字典。
deflist = collections.defaultdict(list) #建立一個預設值為list的預設字典。
defset = collections.defaultdict(set) #建立一個預設值為set的預設字典。
defdict["c"] = 1
defdict.update([("a","b")])
deflist["a"] = 1
defset["b"] = 1
for i in range(5):
deflist[i].append(i) #當key=i的鍵對應的值不存在是,預設建立一個key對應的list集合。并在集合中添加i元素
defset[i].update([(i,i)]) #當key=i的鍵對應的值不存在是,預設建立一個key對應的set集合。并在集合中添加i元素
defdict[i].update([(i,i)]) #當key=i的鍵對應的值不存在是,預設建立一個key對應的dict集合。并在集合中添加i元素
print(defdict,deflist,defset,sep="\n")
有序字典(OrderedDict)
- 和defaultdict一樣,需要導入子產品import collection
- 定義方式和defaultdict類似。但不同的是OrderedDict是有序字典,裡面元素的排列順序是元素的插入順序。
- 注意:3.6版本中的Python的字典就是記錄key插入的順序(IPython不一定有效)
- 簡單示例
import collections
order = collections.OrderedDict() #執行個體化一個有序字典
order.update([(4,10)]) # 插入鍵值對4,10
for i in range(5): #給字典插入新元素
order[i] = i
order.setdefault(6,10) #給字典插入新元素
print(order.keys())
print(order.values())
print(order)
- 有序字典排序
- sorted(iterable, /, *, key=None, reverse=False) 函數會傳回一個新的字典對象
- 例如:
import random,string
word = { _:2 for _ in [random.choice(string.ascii_lowercase) for _ in range(20)]} #随機生成20個字母組成的字典
print(word)
wordsort = sorted(word.items()) #使用sorted将字典,按照key排序。
print(wordsort)
字典與list結合使用:
- 可以使用字典記錄元素。在加個清單list記錄存在字典中元素的實際位置,用清單的順序記錄在字典中對應元素的大小。這樣在使用list周遊時,可以保證在清單中元素的順序。而再查找元素時使用字典查找,保證了檢索的速度,避免了list的缺點。