Python基本數據類型——字典

字典 dict

字典是Python的另外一種有序的可變數據結構,且可存儲任意類型對象。算法

字典是一種鍵值對的數據容器,每一個鍵值(key:value)對用冒號(:)分割,每一個對之間用逗號(,)分割,整個字典包括在花括號「{}」中。鍵和值二者一一對應,與表不一樣的是,詞典的元素沒有順序,不能經過下標引用元素。字典是經過鍵來引用。數據結構

字典中的鍵必須是惟一的同時不可變的,值則沒有限制。函數

建立 dict

>>> dict1 = {'key1':'value1' , 'key2':'value2' , 'key3':'value3'}
>>> dict1
{'key3': 'value3', 'key2': 'value2', 'key1': 'value1'}

字典中的鍵必須是惟一的,類型是不可變類型。所以,也能夠經過以下方式建立命令行

>>> dict1 = {'key1':'value1' , 'key2':'value2' , 3:'value3'} 
>>> dict1
{'key2': 'value2', 'key1': 'value1', 3: 'value3'}

甚至:code

>>> t = (1,2,3) # 元組是不可變的類型,能夠做爲鍵
>>> dict1 = {'key1':'value1' , t:'value2' , 3:'value3'}
>>> dict1      
{'key1': 'value1', 3: 'value3', (1, 2, 3): 'value2'}

因爲一個key只能對應一個value,屢次對一個key放入value,後面的值會把前面的值覆蓋掉:對象

>>> dict1['key4'] = 'VALUE4'
>>> dict1
{'key3': 'value3', 'key2': 'value2', 'key1': 'value1', 'key4': 'VALUE4'}

把數據放入dict的方法,除了初始化時指定外,還能夠經過key放入:ip

>>> dict1['key4'] = 'value4' 
>>> dict1
{'key3': 'value3', 'key2': 'value2', 'key1': 'value1', 'key4': 'value4'}

要避免key不存在的錯誤,有兩種辦法:內存

# 一是經過in判斷key是否存在:
>>> 'value4' in dict1 
False

# 二是經過dict提供的get方法,若是key不存在,能夠返回None,或者本身指定的value:
>>> dict1 = {'key1': 'value1', 'key2': 'value2', 'key3': 'value3'}
>>> dict1
{'key3': 'value3', 'key2': 'value2', 'key1': 'value1'}
>>> dict1['key5'] = dict1.get('value5','value5')
>>> dict1
{'key3': 'value3', 'key2': 'value2', 'key1': 'value1', 'key5': 'value5'}
>>>

注意:返回None的時候Python的交互式命令行不顯示結果。字符串

dict函數快速構造字典:

>>> zip(["a","b","c"],[4,5,6])
[('a', 4), ('b', 5), ('c', 6)]
>>> dict(zip(["a","b","c"],[4,5,6]))
{'a': 4, 'c': 6, 'b': 5}
>>> dict(name="lans",age="22")
{'age': '22', 'name': 'lans'}
>>>

請務必注意,dict內部存放的順序和key放入的順序是沒有關係的。get

和list比較,dict有如下幾個特色:

  1. 查找和插入的速度極快,不會隨着key的增長而增長;
  2. 須要佔用大量的內存,內存浪費多。

而list相反:

  1. 查找和插入的時間隨着元素的增長而增長;
  2. 佔用空間小,浪費內存不多。

因此,dict是用空間來換取時間的一種方法。

dict能夠用在須要高速查找的不少地方,在Python代碼中幾乎無處不在,正確使用dict很是重要,須要牢記的第一條就是dict的key必須是不可變對象。

這是由於dict根據key來計算value的存儲位置,若是每次計算相同的key得出的結果不一樣,那dict內部就徹底混亂了。這個經過key計算位置的算法稱爲哈希算法(Hash)。

要保證hash的正確性,做爲key的對象就不能變。在Python中,字符串、整數等都是不可變的,所以,能夠放心地做爲key。而list是可變的,就不能做爲key:

>>> key = [1, 2, 3]
>>> d[key] = 'a list'
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: unhashable type: 'list'

訪問 dict 中的元素

dict在建立時就指定了key:value的關係,程序能夠經過key來訪問對應的元素。

>>> dict1 = {'key1':'value1' , 'key2':'value2' , 'key3':'value3'}
>>> dict1['key1']
'value1'

字典中的常見的方法:

  • clear():從字典中刪除全部項

例:

>>> dict1.clear()
>>> dict1
{}
  • copy():建立並返回字典的一個淺拷貝(新字典中的元素是對原始字典中元素的引用)

例如:添加一個元素「a」,返回其在列表中個數

>>> d1 = {1:'a',2:'b',3:'c'}
>>> d2 = d1.copy()
# 用id()函數能夠看出值是同一個對象
>>> id(d1[2])
140415073723656
>>> id(d2[2])
140415073723656
>>> 
# 但兩個字典自己不是同一個對象
>>> id(d2)
140415072754216
>>> id(d1)
140415072754776
# 修改d2中的一個值,d1中的將不會被改變,此時d1[1]和d2[1]已經不是同一個對象了。
>>> d2[1]="A"
>>> d2
{1: 'A', 2: 'b', 3: 'c'}
>>> d1
{1: 'a', 2: 'b', 3: 'c'}
  • get(key [ , returnValue]):返回key對應的值;若是key不在字典中,同時指定了returnValue,就返回指定的值。若是沒有指定returnValue,就返回none。

  • has_key(key):若是key在字典中,就返回1,不然返回0

例如:

>>> d1 = {1:'a',2:'b',3:'c'}
>>> d1.has_key(1)
True
>>> d1.has_key(4)
False
  • items():返回一個由元組構成的列表,每一個元組包含一個鍵-值對

例如:

>>> d1.items()
[(1, 'a'), (2, 'b'), (3, 'c')]
  • keys():返回字典中全部鍵的列表

例如:

>>> d1.keys()
[1, 2, 3]
  • values():返回字典全部值的一個列表

例如:

>>> d1.values()
['a', 'b', 'c']
  • popitem():刪除任意鍵-值對,並做爲兩個元素的一個元組返回。若是字典爲空,會產生KeyError異常

  • update(newdic):未來自newdic的全部鍵-值對添加到當前字典中,並覆蓋同名鍵的值

例如:

>>> d1 = {1:'a',2:'b',3:'c'}                
>>> d2 = {3:'A',4:'B',5:'C'}        
>>> d1.update(d2)    
>>> d1
{1: 'a', 2: 'b', 3: 'A', 4: 'B', 5: 'C'}
  • pop(key):指定key 刪除對應的value

例如:

>>> d1.pop(1)
'a'
>>> d1
{2: 'b', 3: 'c'}
>>> d1.pop(3)
'c'
>>> d1
{2: 'b'}
  • fromkeys(seq[, value])):將seq中的元素做爲key,返回一個字段。對應的value爲可選的,默認爲None

例如:

>>> dict = dict.fromkeys(seq)
>>> dict
{'age': None, 'name': None, 'sex': None}
  • iterkeys():返回字典鍵的一個迭代器

  • itervalues():返回字典值得一個迭代器

  • iteritems():返回鍵-值對的一個迭代器

相關文章
相關標籤/搜索