# coding:utf-8html
#--------------------------------------------- 建立和使用字典 ---------------------------------------------python
#電話簿示例app
names = ['Alice', 'Neth', 'Cecil', 'Dee-Dee', 'Earl']ide
numbers = ['2341', '9102', '3158', '0142', '5551']函數
print numbers[names.index('Cecil')] ##查找Cecil電話,列表方式,但願字典方式:phonebook['Cecil']url
#3158spa
#字典方式htm
phonebook = {'Alice': '2341', 'Beth': '9102', 'Cecil': '3158'} #名字是鍵,電話是值,鍵是惟一的,值不是惟一的。對象
print phonebook['Cecil']utf-8
#3158
#dict
#能夠用dict函數經過其餘映射或者對的序列創建字典
items = [('name', 'Gumby'), ('age', 42)]
d = dict(items)
print d
#{'age': 42, 'name': 'Gumby'}
d = dict(name='Gumby', age=42) #也能夠經過關鍵字參數來建立字典
print d
#{'age': 42, 'name': 'Gumby'}
#x = []
#x[42] = 'foobar' #字符串foor關聯到一個空列表42號位置上,顯然是不可能的,由於這個位置根本不存在。爲了將變成可能,我必須用[None]*43
x = {}
x[42] = 'foobar' #字典能夠,我將'foobar'關聯到空字典的鍵42上
print x
#{42: 'foobar'}
#字典的格式化字符串
#若是使用的是字典(以字符串做爲鍵)而不是元組,使用字符串格式化方式更酷一些,在每一個轉換說明符中的%字符後面,能夠加上鍵(用圓括號括起來),後面再跟上其餘說明元素。
phonebook = {'Alice': '2341', 'Beth': '9102', 'Cecil': '3158'}
print "Cecil's phone number is %(Cecil)s." % phonebook #百分號後面加上鍵(圓括號括起來)
#Cecil's phone number is 3158.
#當以這種方式使用字典的時候,只要全部給出的鍵都能在字典中找到,就可使用任意數量的轉換說明符。這類字符串格式化在模板系統中很是有用。
template = '''<html>
<head><title>%(title)s</title></head>
<body>
<h1>%(title)s</h1>
<p>%(text)s</p>
</body>'''
data = {'title': 'My Home Page', 'text': 'Welcome to my home page!'}
print template % data #html例子,格式化模板很方便
#<html>
#<head><title>My Home Page</title></head>
#<body>
#<h1>My Home Page</h1>
#<p>Welcome to my home page!</p>
#</body>
#-------------------------------------------- 字典方法 -------------------------------------------------------
#clear
#清除字典中全部的項。這是個原地操做(相似list.sort),因此無返回值(或者說返回None)
d = {}
d['name'] = 'Gumby'
d['age'] = 42
print d
#{'age': 42, 'name': 'Gumby'}
returned_value = d.clear()
print d
#{}
print returned_value
#None
x = {}
y = x
x['key'] = 'value'
print y
#{'key': 'value'}
x = {} #x變量被清空
print y #y變量字典仍然存在,若是想完全清空,就須要用到clear
#{'key': 'value'}
x = {}
y = x
x['key'] = 'value'
print y
#{'key': 'value'}
x.clear()
print x
#{}
print y #x和y一塊兒被清空
#{}
#copy
#copy方法返回一個具備相同鍵-值對的新字典(這個方法實現的是淺複製,由於值自己就是相同的,而不是副本)。
x = {'username': 'admin', 'machines': ['foo', 'bar', 'baz']}
y = x.copy()
print y
#{'username': 'admin', 'machines': ['foo', 'bar', 'baz']}
y['username'] = 'mlh' #替換不會修改原始字典x變量
print y
#{'username': 'mlh', 'machines': ['foo', 'bar', 'baz']}
print x
#{'username': 'admin', 'machines': ['foo', 'bar', 'baz']}
y['machines'].remove('bar') #修改某個值(原地修改,而不是替換),原始字典x變量也會改變
print y
#{'username': 'mlh', 'machines': ['foo', 'baz']}
print x
#{'username': 'admin', 'machines': ['foo', 'baz']}
#避免這個問題的一種方法就是使用深複製,複製其包含的全部值。可使用copy模塊的deepcopy函數來完成操做。
#deepcopy
#深複製
from copy import deepcopy #導入copy模塊的deepcopy函數
d = {}
d['names'] = ['Alfred', 'Bertrand']
c = d.copy()
dc = deepcopy(d)
d['names'].append('Clive') #原始字典變量d增長值
print d
#{'names': ['Alfred', 'Bertrand', 'Clive']}
print c #淺複製會一塊兒增長
#{'names': ['Alfred', 'Bertrand', 'Clive']}
print dc #深複製則不會改變
#{'names': ['Alfred', 'Bertrand']}
#fromkeys
#給定的鍵創建新字典,每一個鍵對應一個默認值None
print {}.fromkeys(['name', 'age']) #它首先構造空字典,而後調用fromkeys方法創建另一個詞典---有些多餘。建議用dict方法
#{'age': None, 'name': None}
print dict.fromkeys(['name', 'age']) #dict方法,效果和上面同樣。建議使用。
#{'age': None, 'name': None}
print dict.fromkeys(['name', 'age'], '(unknown)') #若是不想使用None做爲默認值,也能夠本身提供默認值。
#{'age': '(unknown)', 'name': '(unknown)'}
#get
#更寬鬆的訪問字典方法,通常訪問不存在的項會報錯,get訪問不會報錯,獲得None
d = {}
#print d['name'] #這樣訪問會報錯
print d.get('name') #get不會報錯,返回None
#None
print d.get('name', 'N/A') #也能夠自定義None,改爲N/A,若是鍵在不會替換
#N/A
d['name'] = 'Eric'
print d.get('name') #若是鍵存在,get用起來和普通字典查詢同樣
#Eric
print d.get('name', 'N/A') #若是鍵存在,不會替換
#Eric
#has_key
#檢查有沒鍵
d = {}
print d.has_key('name') #沒有鍵
#False
d['name'] = 'Eric'
print d.has_key('name') #有鍵
#True
#items和iteritems
#items將字典全部的項以列表方法返回,列表中的每一項都表示爲(鍵,值)隊的形式。可是項在返回時並無遵循特定的次序。
d = { 'title': 'Python Web Site', 'url': 'http://www.python.org', 'spam': 0 }
print d.items()
#[('url', 'http://www.python.org'), ('spam', 0), ('title', 'Python Web Site')]
#iteritems方法的做用大體相同,可是會返回一個迭代器對象而不是列表:
it = d.iteritems() #返回迭代器
print it
#<dictionary-itemiterator object at 0x00000000022B2A98>
print list(it) #轉換爲列表
#[('url', 'http://www.python.org'), ('spam', 0), ('title', 'Python Web Site')]
#keys和iterkeys
#keys方法將字典中的鍵以列表形式返回,而iterkeys則返回針對鍵的迭代器。
d = { 'title': 'Python Web Site', 'url': 'http://www.python.org', 'spam': 0 }
print d.keys() #將字典中的鍵以列表形式返回
#['url', 'spam', 'title']
it = d.iterkeys() #返回迭代器
print it
#<dictionary-keyiterator object at 0x00000000022C2B38>
print list(it) #轉換爲列表
#['url', 'spam', 'title']
#values和itervalues
#valuse方法以列表的形式返回字典中的值,與返回鍵的列表不一樣的是,返回值的列表中能夠包含重複的元素。itervalues則返回值的迭代器。
d = {}
d[1] = 1
d[2] = 2
d[3] = 3
d[4] = 1
print d.values()
#[1, 2, 3, 1]
it = d.itervalues() #返回迭代器
print it
print list(it) #轉換爲列表
#<dictionary-valueiterator object at 0x0000000002232B88>
#pop
#移除鍵和值
d = {'x': 1, 'y': 2}
d.pop('x') #刪除x鍵和值
print d
#{'y': 2}
#popitem
#隨機刪除
d = {'x': 1, 'y': 2 ,'z': 3}
d.popitem() #隨機刪除一個,好處不用指定鍵,字典沒有順序概念,若想一個個移除,這個方法很是有效。
print d
#{'x': 1, 'z': 3}
#setdefault
#相似get方法,在沒有鍵狀況下能夠設定相應鍵
d = {}
d.setdefault('name', 'N/A')
print d
#{'name': 'N/A'}
d['name'] = 'Gumby'
d.setdefault('name', 'N/A') #有鍵不會替換
print d
#{'name': 'Gumby'}
#update
#一個字典更新到另外一個字典
d = {
'x': '1',
'y': '2',
'z': '3'
}
e = {'a': '4'}
d.update(e)
print d
#{'y': '2', 'x': '1', 'z': '3', 'a': '4'}
#涉及的函數
#dict(seq) 用(鍵,值)對(或者映射和關鍵字參數)創建字典