(1)首先,解釋一下何爲映射?
一種通過名字來引用值的數據結構,我們稱之爲映射。
而字典是Python中唯一內建的映射類型。字典中的值沒有特殊的順序,但是都存儲在一個特定的鍵(key)下。鍵可以是數字、字符串甚至是元組。
(2)創建和使用字典
(2.1)創建字典
—{}
如:phonebook={"Alice": "2341", "Beth": "9102", "Cecil": "3258"}
—dict函數
可以用dict函數,通過其他映射或者對的序列建立字典。
>>>items = [("name","Gumby"),("age",42)]
>>>d = dict(items)
>>>d
{"age":42,"name":"Gumby"}
如果不帶任何參數,dict函數返回一個空字典 >>>dict()
{}
(2.2)訪問字典—直接使用key訪問:key不存在會報錯,可以使用in和not in判斷。
—循環遍歷:
例:
>>>dic1={"name":"milo","gender":"male","age":25}
>>>for k in dic1:
print(k)
name
gender
age
—使用迭代器:for key in dict1(2.3)基本字典操作
字典的基本行爲在很多方面與序列類似:
※len(d)返回d中項(鍵-值對)的數量;
※d[k]返回關聯在鍵k上的值;
※d[k]=v將值v關聯到鍵k上;
※del d[k]刪除鍵爲k的項;
※k in d檢查d中是否含有鍵爲k的項。
□鍵類型:字典的鍵不一定爲整型數據(但也可以是),鍵可以是任意的不可變類型,比如浮點型(實型)、字符串或元組。
□自動添加:即使鍵起初在字典中並不存在,也可以爲它賦值,這樣字典就可以建立新的項。而列表(在不使用append方法或其他類似操作的情況下)不能將值關聯到列表 範圍之外的索引上。
□成員資格:表達式k in d(d爲字典)查找的是鍵,而不是值。表達式v in l(l爲列表)則用來查找值,而不是索引。
(3)字典方法
1.clear
clear方法清除字典中所有的項。這個是原地操作,無返回值。
>>> dic1={"name":"milo","age":25,"tel":"2584"}
>>> dic1
{'age': 25, 'tel': '2584', 'name': 'milo'}
>>> dic1.clear()
>>> dic1
{}
2.fromkeysfromkeys方法用給定的鍵建立新的字典,每個鍵對應一個默認的值None。
>>> dic1
{}
>>> dic1.fromkeys(["name","gender","address","ID","tel"])
{'tel': None, 'address': None, 'ID': None, 'gender': None, 'name': None
如果不想使用None作爲默認值,也可以自己提供默認值。
>>> {}.fromkeys(["name","gender","address"],("unknow"))
{'address': 'unknow', 'gender': 'unknow', 'name': 'unknow'}
3.getget方法是個更寬鬆的訪問字典項的方法。一般來說,如果試圖訪問字典中不存在的項時會出錯:
>>> dic1={"name":"milo","age":25,"tel":"2584"}
>>> dic1
{'age': 25, 'tel': '2584', 'name': 'milo'}
>>> dic1["gender"]
Traceback (most recent call last):
File "<pyshell#13>", line 1, in <module>
dic1["gender"]
KeyError: 'gender'
而用get就不會: >>> print(dic1.get("gender"))
None
可以看到,當使用get訪問一個不存在的鍵時,沒有任何異常,而得到了None值。還可以自定義“默認”值,替換None: >>> dic1
{'age': 25, 'tel': '2584', 'name': 'milo'}
>>> dic1.get("address")
>>> print(dic1.get("address"))
None
>>> print(dic1.get("gender","no"))
no
如果鍵存在,get用起來與普通的字典查詢一樣: >>> dic1.get("name")
'milo'
4.poppop方法用來獲得給定鍵的值,然後將這個鍵值對從字典中移除。
>>> x={'machine': ['bee', 'bar', 'baz'], 'username': 'mlh'}
>>> x.pop("machine")
['bee', 'bar', 'baz']
>>> x
{'username': 'mlh'}
5.itemsitems方法將字典所有的項以列表方式返回,列表中的每一項都表示爲(鍵,值)對的形式,但是項在返回時並沒有遵循特定的次序。
>>> d={
"title":"Python Web Site",
"url":"http://www.python.org",
"spam":0
}
>>> d.items()
dict_items([('spam', 0), ('url', 'http://www.python.org'), ('title', 'Python Web Site')])
6.keyskeys方法將字典中的鍵以列表形式返回。
>>> d={
"title":"Python Web Site",
"url":"http://www.python.org",
"spam":0
}
>>> d.keys()
dict_keys(['spam', 'url', 'title'])
7.valuesvalues方法將字典中的值以列表形式返回。
>>> d={
"title":"Python Web Site",
"url":"http://www.python.org",
"spam":0
}
>>> d.values()
dict_values([0, 'http://www.python.org', 'Python Web Site'])
8.updateupdate方法可以利用一個字典更新另外一個字典。
>>> d={
"title":"Python Web Site",
"url":"http://www.python.org",
"changed":"Mar 14 22:09:15 MET 2008"
}
>>> x={"title":"Python Language Website","spam":0}
>>> d.update(x)
>>> d
{'url': 'http://www.python.org', 'title': 'Python Language Website', 'spam': 0,
'changed': 'Mar 14 22:09:15 MET 2008'}
9.copycopy方法返回的是具有相同鍵值對的新字典,需要注意的是:這個方法實現的是淺拷貝!與此對應的是深拷貝!
二者的區別,如下:
【例1】
>>> from copy import deepcopy
>>> d={"name":"milo","gender":"male","age":25} #d:原始字典
>>> c=d.copy() #c:淺拷貝
>>> dc=deepcopy(d) #dc:深拷貝
>>> d["name"]="Smith" #修改原始字典中的"name"值
>>> d
{'gender': 'male', 'age': 25, 'name': 'Smith'}
>>> c
{'gender': 'male', 'name': 'milo', 'age': 25}
>>> dc
{'gender': 'male', 'name': 'milo', 'age': 25}
>>> id(d)
52193080
>>> id(c)
52192760
>>> id(dc)
52192960
可以看出,無論是深拷貝還是淺拷貝,原始字典與拷貝字典彼此獨立佔用內存空間。因此,修改原始字典的某一項時,不影響拷貝字典。
明白了這一點之後,我們再看一個例子。
【例2】
>>> from copy import deepcopy
>>> d={"name":["Bob","milo","Mary"],"gender":"male"}#d:原始字典
>>> c=d.copy() #c:淺拷貝
>>> dc=deepcopy(d) #dc:深拷貝
>>> d["name"].append("Smith")#修改原始字典中的"name"值
>>> d
{'name': ['Bob', 'milo', 'Mary', 'Smith'], 'gender': 'male'}
>>> c
{'name': ['Bob', 'milo', 'Mary', 'Smith'], 'gender': 'male'}
>>> dc
{'name': ['Bob', 'milo', 'Mary'], 'gender': 'male'}
看完此案例之後,普及一下:淺拷貝:只拷貝父對象,不會拷貝對象內部的子對象。
深拷貝:拷貝父對象及其子對象。
也就是說,
※當你改變原始字典一級目錄下(父級)的對象時,不會對拷貝字典產生任何影響。
因爲 原始字典與拷貝字典彼此獨立佔用內存空間!
當你改變原始字典子目錄下的對象時,對淺拷貝字典產生直接影響,不影響深拷貝。
因爲 淺拷貝只拷貝父對象,不會拷貝對象內部的子對象,所以淺拷貝的子對象與原始字典保持一致!
而深拷貝由於拷貝父對象及其子對象,所以對它而言,任何對原始字典的修改都與它無關!
【例3】(不解釋,檢查一下你理解“深拷貝”與“淺拷貝”了嗎?)
>>> from copy import deepcopy
>>> x={"username":"admin","machine":["foo","bar","baz"]}
>>> y=x.copy()
>>> z=deepcopy(x)
>>> x["username"]="mlh"
>>> x["machine"][0]="bee"
>>> x
{'machine': ['bee', 'bar', 'baz'], 'username': 'mlh'}
>>> y
{'username': 'admin', 'machine': ['bee', 'bar', 'baz']}
>>> z
{'username': 'admin', 'machine': ['foo', 'bar', 'baz']}
----------------各種推導式----------------
推導式分爲列表推導式(list),字典推導式(dict),集合推導式(set)三種
(1)列表推導式。
功能:一種方便的列表創建方法,
格式:用中括號括起來,中間用for語句,後面跟if語句用作判讀,滿足條件的傳到for語句前面用作構建先的列表
例:
>>> li=[i*2 for i in range(10) if i % 2 == 0]
>>> print li
[0, 4, 8, 12, 16]
>>>
(2)字典推導式。
格式:跟列表推導式的用法差不多,只是不中括號改成大括號。
例:#快速交換字典 鍵—值
>>> mca={"a":1, "b":2, "c":3, "d":4}
>>> dicts={v:k for k,v in mca.items()}
>>> print dicts
{1: 'a', 2: 'b', 3: 'c', 4: 'd'}
>>>
(3)集合推導式。
功能:跟列表推導式差不多,都是對一個序列的元素全部執行相同的操作,但集合是一種無序的序列。
格式:1.不使用中括號,使用大括號;
2.結果中無重複;
3.結果是一個set()集合,集合裏面是一個序列。
例:
>>> squared={i*2 for i in [1,1,2]}
>>> print squared
set([2, 4])
>>>