7.字典

----------------字典----------------
(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.fromkeys
    fromkeys方法用給定的鍵建立新的字典,每個鍵對應一個默認的值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.get
   get方法是個更寬鬆的訪問字典項的方法。一般來說,如果試圖訪問字典中不存在的項時會出錯:
   >>> 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.pop
   pop方法用來獲得給定鍵的值,然後將這個鍵值對從字典中移除。
   >>> x={'machine': ['bee', 'bar', 'baz'], 'username': 'mlh'}
   >>> x.pop("machine")
   ['bee', 'bar', 'baz']
   >>> x
   {'username': 'mlh'}
 5.items
   items方法將字典所有的項以列表方式返回,列表中的每一項都表示爲(鍵,值)對的形式,但是項在返回時並沒有遵循特定的次序。
   >>> 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.keys
   keys方法將字典中的鍵以列表形式返回。
   >>> d={
	   "title":"Python Web Site",
	   "url":"http://www.python.org",
	   "spam":0
          }
   >>> d.keys()
   dict_keys(['spam', 'url', 'title'])
 7.values
   values方法將字典中的值以列表形式返回。
   >>> 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.update
   update方法可以利用一個字典更新另外一個字典。
   >>> 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.copy
   copy方法返回的是具有相同鍵值對的新字典,需要注意的是:這個方法實現的是淺拷貝!與此對應的是深拷貝!
   二者的區別,如下:
  【例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])
       >>>


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章