天天看點

Python入門基礎第十課--字典    1.前言    2.字典的建立和使用    3.字典方法

    1.前言

    通過前面的章節我們可以知道,清單這種資料結構是将值組織到一個結構中,并且通過編号去引用它的值。強大的Python難道隻有這一種引用方式嗎?答案是否定的,在這章我們将介紹一個新的引用方式--字典,字典是Python裡面唯一内建的映射類型,字典裡面的值沒有特殊的順序,但是都存儲在一個特定的鍵(key)底下。鍵的範圍很廣,包括:數字、字元串、元組。

    字典的建立,一方面是為了讓我們輕松查找某個特定的鍵,進而獲得對應的值。另一方面是為了讓我們能夠快速地得到特定鍵的位置。很友善,很強大。

    2.字典的建立和使用

    2.1 建立字典

  • 直接建立
>>> phonebook={'Alice':'1234','Benth':'5678','Cecil':'9999'}
>>> phonebook
{'Alice': '1234', 'Benth': '5678', 'Cecil': '9999'}
           

    仔細看上面的例子,像這種直接建立字典的方法,我們要記住字典裡面鍵和值對應的格式。在這裡,鍵是名字,值是電話号碼。對應的鍵和值之間用冒号來分隔,不同的鍵值對用逗号來分隔,整體的用花括号括起來,表示一個完整的字典。将建立好的字典在shell裡面列印出來以後,你會看到格式很整齊,很規整。

  • dict函數
>>> phonenumbers=[('name','Alice'),('numbers','12345678')]
>>> p=dict(phonenumbers)
>>> p
{'name': 'Alice', 'numbers': '12345678'}    
           
>>> p=dict(name='Alice',numbers='123456789')
>>> p
{'numbers': '123456789', 'name': 'Alice'}
           

    還記得我們前面說過的list函數嗎?它和這裡的dict函數一樣,也是類型,而不是具體的函數,我們得牢記這一點。

    2.2基本字典操作

    字典的行為在很多方面與序列類似,回頭看看我們前面序列裡面說過的操作方法:

  • len(d):傳回d中鍵-值對的數量。
  • d[k]傳回關聯到鍵k上的值。
  • d[k]=v将值v關聯到鍵k上。
  • del d[k]删除鍵為k的鍵值對。
  • k in d 檢查d中是否有關于k鍵的鍵值對,檢查成員資格。   

    來看一個字典的入門例子:

people={
    'Alice':{
        'phone': '2341',
        'addr': 'Foo drive 23'
    },

    'Benth':{
        'phone': '9102',
        'addr': 'Bar street 42'
    },

    'Ceil': {
        'phone': '3158',
        'addr': 'Baz avenue 90'
    }
}

labels={
    'phone': 'phone number',
    'addr': 'address'
}

name=raw_input('Name: ')
request=raw_input('Phone number (p) or address (a)?')

if request=='p':
    key='phone'
if request=='a':
    key='addr'

if name in people:
    print "%s's %s is %s ." %(name, labels[key], people[name][key])
           
/usr/local/bin/python2.7 /Users/yangjiayuan/PycharmProjects/day/day03/dirctory.py
Name: Ceil
Phone number (p) or address (a)?a
Ceil's address is Baz avenue 90. 

Process finished with exit code 0
           

    看一看上面的代碼自己了解一下,看的過程中注意以下兩點:

  1. 鍵是任意不可變類型
  2. 當我們嘗試在清單裡面嘗試将一個值關聯到一個空清單的某個位置上,會報錯。這顯然是不可能的,因為這個位置根本不存在,為了可以成功操作,我們必須采用這樣的操作:[None]*number來将其初始化,而不能使用[]。但是我們可以将一個值關聯到一個空字典裡面,而不會發生任何錯誤。來看看。
>>> p=[]
>>> p[10]='Alice'
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
IndexError: list assignment index out of range
>>> x={}
>>> x[42]='Alice'
>>> x
{42: 'Alice'}
           

    這個例子,值得深思!

    3.字典方法

    對比我們前面學過的清單,和其他的内建類型一樣,字典也有方法。這些方法非常有用,但是可能不會像清單或者字元串方法那樣頻繁被使用,在這裡,我會挑一些常用的方法來給出一些具體的例子。假如你以後使用的方法不在下面叙述的這些裡面,你可以參考自己的資料或者再查詢,得到相關方法的使用。

  • clear方法

    clear方法用于清除字典中的所有項。這個是原地操作,所有沒有傳回值。 

>>> d={}
>>> d['name']='Alice'
>>> d['number']='22'
>>> d
{'name': 'Alice', 'number': '22'}
>>> returne_value=d.clear()
>>> d
{}
>>> print returne_value
None
           

    為什麼首先要講這個方法呢?這不就是清除一個字典裡面的項嗎?還有什麼用,我們繼續看:

>>> x={}
>>> y=x
>>> x['key']='value'
>>> y
{'key': 'value'}
>>> x={}
>>> y
{'key': 'value'}
           

     再看:

>>> x={}
>>> y
{'key': 'value'}
>>> x={}
>>> y=x
>>> x['key']='value'
>>> y
{'key': 'value'}
>>> x.clear()
>>> y
{}
           

    在上面兩個例子,x和y最初對應于同一個字典,我們通過将x關聯到一個空的字典來"清除"它,這對y一點影響都沒有,y還是關聯到原來的字典。但是用來clear方法以後,原始字典裡面的元素被清除了,進而y也變成空的了。

  • copy方法

    copy方法傳回一個具有相同鍵-值對的新字典。來看看。

>>> x={'hostname':'youzi','ipaddress':'192.168.999.999','username':'yangjiayuan'}
>>> x
{'username': 'yangjiayuan', 'hostname': 'youzi', 'ipaddress': '192.168.999.999'}
>>> y=x.copy()
>>> y
{'username': 'yangjiayuan', 'hostname': 'youzi', 'ipaddress': '192.168.999.999'}
>>> y['username']='wangchao'
>>> y
{'username': 'wangchao', 'hostname': 'youzi', 'ipaddress': '192.168.999.999'}
>>> x
{'username': 'yangjiayuan', 'hostname': 'youzi', 'ipaddress': '192.168.999.999'}
           

    可以看到,當在副本中替換值得時候,原始字典不受影響,但是如果修改了某個值(原地修改,而不是替換),原始字典也會改變,因為同樣的值也存儲在原字典中。

    避免上述描述的問題的措施是采用深複制,複制包含的所有值。可以使用copy子產品的deepcopy函數來完成這個操作。來看看:

>>> from copy import deepcopy
>>> d={}
>>> d['names']=['Alice','Benth']
>>> c=d.copy()
>>> dc=deepcopy(d)
>>> d['names'].append('Clive')
>>> c
{'names': ['Alice', 'Benth', 'Clive']}
>>> dc
{'names': ['Alice', 'Benth']}
           
  • get方法

    get方法是個更寬松的通路字典的方法,一般來說,如果試圖通路字典中不存在的項時會出錯。    

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

    其他的方法嘞,都是用到的時候才去看它的介紹的,一般情況下用的很少,掌握上面三個就可以了,下面給出上面一個入門代碼的更新版本,利用get方法去通路”資料庫“實體。

people={
    'Alice':{
        'phone': '2341',
        'addr': 'Foo drive 23'
    },

    'Benth':{
        'phone': '9102',
        'addr': 'Bar street 42'
    },

    'Ceil': {
        'phone': '3158',
        'addr': 'Baz avenue 90'
    }
}

labels={
    'phone': 'phone number',
    'addr': 'address'
}

name=raw_input('Name: ')
request=raw_input('Phone number (p) or address (a)?')

key=request

if request=='p':
    key='phone'
if request=='a':
    key='addr'


person=people.get(name,{})
label=labels.get(key,key)
result=person.get(key,'not available')

print "%s's %s is %s. " %(name, label, result )
           

    對比上面的代碼,自己再看看,主要是代碼的後半部分,好好了解下。

    關于字典這部分就說這麼多咯,是一個蠻重要的概念,希望引起大家的關注和重視。下一章節預告--條件、循環和其他語句。