1. 程式人生 > >python筆記四-字典

python筆記四-字典

1、當索引不好用時候,使用字典。

2、字典的定義:

>>> phonebook = {'Alice':'2341','Beth':'9102','Ceil':'3258'}
>>> PHONEBOOK
Traceback (most recent call last):
  File "<pyshell#1>", line 1, in <module>
    PHONEBOOK
NameError: name 'PHONEBOOK' is not defined
>>> phonebook
{'Beth': '9102', 'Alice': '2341', 'Ceil': '3258'}
>>> 

3、使用dict函式將序列建立字典

>>> items = [('name','Gumby'),('age',42)]
>>> d=dict(items)
>>> d
{'age': 42, 'name': 'Gumby'}

>>> d['name']
'Gumby'

刪除字典的 鍵,使用 del d[key], 檢測d中是否有key的鍵,使用 key in d,來判斷成員資格

4、建立一個空的字典,符號是{}, 而不是[],建立之後可以直接新增鍵值,如下:

>>> x = []
>>> x[42] = 'Foobar'
Traceback (most recent call last):
  File "<pyshell#8>", line 1, in <module>
    x[42] = 'Foobar'
IndexError: list assignment index out of range
>>> x = {}
>>> x[42] = 'Foobar'
>>> x
{42: 'Foobar'}

5、利用字典格式化字串,格式: “%(key)s” % d

>>> phonebook
{'Beth': '9102', 'Alice': '2341', 'Ceil': '3258'}
>>> "Ceil's phone number is %(Ceil)s." % phonebook
"Ceil's phone number is 3258."

>>> "Beth: %(Beth)s" % phonebook
'Beth: 9102'

6、字典方法

(1)clear。將清除原始字典的所有鍵值

>>> x = {}
>>> x['1'] = 'aaa'
>>> y = x
>>> y
{'1': 'aaa'}
>>> y.clear()
>>> y
{}
>>> x
{}

如果要求只清除x,而保留y的內容,可以執行x={},

(2)copy。執行淺複製

>>> x={'1':'aaa','2':['xx','yy','zz']}
>>> y = x.copy()
>>> y
{'1': 'aaa', '2': ['xx', 'yy', 'zz']}
>>> y['1'] = '111'
>>> x
{'1': 'aaa', '2': ['xx', 'yy', 'zz']}
>>> y
{'1': '111', '2': ['xx', 'yy', 'zz']}

注意:x的鍵值'1'沒有改變,但是對y執行以下操作,x的內容發生了變化

>>> y
{'1': '111', '2': ['xx', 'yy', 'zz']}
>>> y['2'].remove('xx')
>>> y
{'1': '111', '2': ['yy', 'zz']}
>>> x
{'1': 'aaa', '2': ['yy', 'zz']}

注意:x鍵值'2'在執行remove之後發生了變化,x被修改了,為了達到複製之後相互獨立的效果,深複製可以解決以上問題

>>> from copy import deepcopy
>>> d = {}
>>> d['111'] = ['aaa','bbb']
>>> c = d.copy()
>>> dc = deepcopy(d)
>>> d['111'].append('ccc')
>>> c
{'111': ['aaa', 'bbb', 'ccc']}
>>> dc
{'111': ['aaa', 'bbb']}

說明:c會隨著d而修改,而dc 則不受影響。

(3)fromkeys 函式,構建字典鍵值

>>> {}.fromkeys(['key1','key2'])
{'key2': None, 'key1': None}

說明:以上通過空字典建立二對鍵值(鍵值列表為key1和key2),預設值為‘None’

>>> dict.fromkeys(['k1','k2','k3','k4'])
{'k4': None, 'k1': None, 'k3': None, 'k2': None}

說明:呼叫了dict的fromkeys函式

>>> dict.fromkeys(['key1','key2','key3','key4'],'unknown')
{'key1': 'unknown', 'key2': 'unknown', 'key4': 'unknown', 'key3': 'unknown'}

說明:預設值改為了‘unknown’

(4)get方法。可以安全訪問字典中不存在的鍵值,一般常規下根據索引去訪問鍵值會發生異常,而用get方法不會

>>> d = {}
>>> d['a']
Traceback (most recent call last):
  File "<pyshell#2>", line 1, in <module>
    d['a']
KeyError: 'a'
>>> d.get('a')
>>> print(d.get('a'))
None
>>> 

也可以提供預設輸出值

>>> d.get('a','N/A')
'N/A'

正常訪問存在的鍵值,如下

>>> d['a'] = 'aaaaa'
>>> d.get(['a'])
Traceback (most recent call last):
  File "<pyshell#7>", line 1, in <module>
    d.get(['a'])
TypeError: unhashable type: 'list'
>>> d.get('a')
'aaaaa'

(5)has_key方法。用來檢查字典中是否存在某鍵key,但是python3.x不包括這個函式

>>> d
{'a': 'aaaaa'}

>>> d.has_key('a')
Traceback (most recent call last):
  File "<pyshell#10>", line 1, in <module>
    d.has_key('a')
AttributeError: 'dict' object has no attribute 'has_key'

可以用in來判斷

>>> 'a' in d
True

>>> 'b' in d
False

(6)items和iteritmes,python3.x不支援iteritems,

>>> d = {'1':'aaa', '2':'bbb','3':'ccc','4':'ddd'}
>>> d.items
<built-in method items of dict object at 0x02D8AB20>
>>> d.items()
dict_items([('4', 'ddd'), ('3', 'ccc'), ('2', 'bbb'), ('1', 'aaa')])
>>> it = d.iteritems()
Traceback (most recent call last):
  File "<pyshell#16>", line 1, in <module>
    it = d.iteritems()
AttributeError: 'dict' object has no attribute 'iteritems'
>>> it = d.items
>>> list(it)
Traceback (most recent call last):
  File "<pyshell#18>", line 1, in <module>
    list(it)
TypeError: 'builtin_function_or_method' object is not iterable

(7)keys和iterkeys,python3.x不支援iterkeys

>>> d
{'4': 'ddd', '3': 'ccc', '2': 'bbb', '1': 'aaa'}

>>> d.keys
<built-in method keys of dict object at 0x02D8AB20>
>>> d.keys()
dict_keys(['4', '3', '2', '1'])

(8)pop彈出鍵值(返回值後從字典中刪除)

>>> d
{'4': 'ddd', '3': 'ccc', '2': 'bbb', '1': 'aaa'}
>>> d.pop('1')
'aaa'
>>> d
{'4': 'ddd', '3': 'ccc', '2': 'bbb'}

(9)popitem隨機彈出鍵值

>>> d
{'4': 'ddd', '3': 'ccc', '2': 'bbb'}
>>> d.popitem()
('4', 'ddd')
>>> d
{'3': 'ccc', '2': 'bbb'}

(10)setdefault,當鍵不存在,使用預設值設定鍵對應的值,如果存在鍵,忽略setdefault操作,均返回當前鍵對應的值

>>> d
{'3': 'ccc', '2': 'bbb'}
>>> d.setdefault('5','N/A')
'N/A'
>>> d
{'5': 'N/A', '3': 'ccc', '2': 'bbb'}
>>> d.setdefault('2','N/A')
'bbb'
>>> d
{'5': 'N/A', '3': 'ccc', '2': 'bbb'}

(11)update。用新字典的鍵值替換舊字典的鍵值

>>> d
{'5': 'N/A', '3': 'ccc', '2': 'bbb'}

>>> d1 = {'5':'eee'}
>>> d.update(d1)
>>> d
{'5': 'eee', '3': 'ccc', '2': 'bbb'}

(12)values和 itervalues

>>> d
{'5': 'eee', '3': 'ccc', '2': 'bbb'}

>>> d.values
<built-in method values of dict object at 0x02D8AB20>
>>> d.values()
dict_values(['eee', 'ccc', 'bbb'])

python3不支援value迭代器

>>> itv = d.values
>>> list(itv)
Traceback (most recent call last):
  File "<pyshell#41>", line 1, in <module>
    list(itv)
TypeError: 'builtin_function_or_method' object is not iterable
>>> itv = d.itervalues
Traceback (most recent call last):
  File "<pyshell#42>", line 1, in <module>
    itv = d.itervalues
AttributeError: 'dict' object has no attribute 'itervalues'
>>> itv = d.itervalues()
Traceback (most recent call last):
  File "<pyshell#43>", line 1, in <module>
    itv = d.itervalues()
AttributeError: 'dict' object has no attribute 'itervalues'