python之字典

來源:互聯網
上載者:User

標籤:python   字串   names   電話   讀者   

通過名字引用值得資料結構.這種結構類型稱為映射.字典是python中唯一內建的映射類型.字典中的值並沒有特殊的順序,但是都儲存在一個特定的鍵裡.鍵可以是數字,字串甚至是元組.


某些情況下,字典比列表更加適用:

1.表徵遊戲棋盤的狀態,每個鍵都是由座標值組成的元組;

2.隱藏檔修改次數,用檔案名稱作為鍵;

3.數字電話/地址薄


假如有一個人名列表如下:

>>> names = [‘Alice‘,‘Beth‘,‘Cecil‘,‘Earl‘]

>>> numbers = [‘3123‘,‘3125‘,‘5654‘,‘9877‘]

>>> numbers[names.index(‘Cecil‘)]

‘5654‘

>>> 


看到這裡讀者會疑問:為什麼用字串而不用整數表示電話號碼呢?

>>> 0142

98

>>> 


 因為進位的原因 所以不能這樣使用


4.2 建立和使用字典

phonebook = {‘Alice‘:‘1234‘,‘Beth‘:4321}

字典由多個鍵與其對應的值構成的對組成. 名字是鍵  號碼是 值.

字典中的鍵是唯一的,而值並不是唯一的


4.2.1 dict函數

可以用dict函數,通過其他映射或者這樣的序列對建立字典.

>>> items = [(‘name‘,‘Gumby‘),(‘age‘,42)]

>>> d = dict(items)

>>> d

{‘age‘: 42, ‘name‘: ‘Gumby‘}

>>> d[‘name‘]

‘Gumby‘

>>> 


dict函數也可以通過關鍵字參數來建立字典

>>> d = dict(name=‘Gumby‘,age=42)

>>> d

{‘age‘: 42, ‘name‘: ‘Gumby‘}

>>> 


這可能是dict函數最有用的功能但是還能以映射作為dict函數的參數,以建立其項與映射相同的字典(如果不帶任何參數,則dict函數返回一個新的空字典,就像list,tuple以及str等函數一樣).如果另一個映射也是字典,也可以使用本章稍後講到的字典方法copy.


4.4.4 基本字典操作

字典的基本行為在很多方面與序列類似:

1.len(d)返回d中項的數量

2.d[k]返回關聯到鍵k上的值

3.d[k]=v將值v關聯到鍵k上

4.del d[k]刪除鍵為k的項

5.k in d檢查d中是否有含有鍵為k的項

儘管字典和列表有很多特性相同,但也有下面一些重要的區別.

鍵類型:字典的鍵不一定為整型資料(但也可能是),也可能是其他不可變類型,比如浮點型(實型),字串或者元組.

自動添加:即使那個鍵起初在字典中並不存在,也可以為它分配一個值,這樣字典就會建立新的項。而不能將值關聯到列表範圍之外的索引上。

成員資格:運算式k in d (d為字典)尋找的鍵,而不是值。運算式v in l(l為列表)則是用來尋找值,而不是索引。


在字典中檢查鍵的成員資格比在列表中檢查值得成員資格更高效,資料結構的規模越大,兩者的效率差距越明顯。


第一點---------鍵可以為任何不可變類型-----是字典最強大的地方。第二點也很重要。

>>> x = {}

>>> x[42] = ‘Foobar‘

>>> x

{42: ‘Foobar‘}

>>> 


首先,程式試圖將字串‘Foobar‘關聯到一個空列表的42號位置上--------這顯然是不可能的,因為這個位置根本不存在。為了將其變為可能,我必須用[None] * 43 或者其他方式初始化x,而不能僅使用[]。但是,下一個例子工作得很好。我將‘Foobar’關聯到空字典的鍵42上,沒問題!新的項已經添加到字典中。


4.1 字典樣本

#!/usr/bin/env python

people = {

        ‘Alice‘:{‘phone‘:‘2341‘,‘addr‘:‘Foo drive 23‘},

        ‘Beth‘:{‘phone‘:‘1234‘,‘addr‘:‘Bar street 32‘},

        ‘Cecil‘:{‘phone‘:‘1234‘,‘addr‘:‘Baz avendas 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])


執行結果

[[email protected] ~]# ./python.py 

Name: Alice

phone number(p) or address(a)? a

Alice‘s address is Foo drive 23.


4.2.3 字典的格式化字串

>>> phonebook = {‘Beth‘:‘9102‘,‘Alice‘:‘2341‘,‘Cecil‘:‘3258‘}

>>> phonebook

{‘Beth‘: ‘9102‘, ‘Alice‘: ‘2341‘, ‘Cecil‘: ‘3258‘}

>>> "Cecil‘s phone number is %(Cecil)s." % phonebook

"Cecil‘s phone number is 3258."

>>>


除了增加的字串鍵之外,轉換說明符還是像以前一樣工作.當以這種方式使用字典的時候,只要所有給出的鍵都能在字典中找到,就可以獲得任意數量的轉換說明符.這類字串格式化在模板系統中非常有用

>>> 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>

<head><title>My Home Page</title></head>

<body>

<h1>My Home Page</h1>

<p>Welcome to my home page</p>

<body>

>>>


4.2.4   字典方法

就像其他內建類型一樣,字典也有方法.這些方法非常有用,但是可能不會像使用列表或者字串方法那樣頻繁地使用.


1.clear

clear方法清除字典中所有的項.

>>> d = {}

>>> d[‘name‘] = ‘Gumby‘

>>> d[‘age‘] = 42

>>> d

{‘age‘: 42, ‘name‘: ‘Gumby‘}

>>> returned_value = d.clear()

>>> d

{}

>>> print returned_value

None

>>>


第一種方法

>>> x = {}

>>> y = x

>>> x[‘key‘] = ‘value‘

>>> y

{‘key‘: ‘value‘}

>>> x = {}

>>> y

{‘key‘: ‘value‘}

>>>


第二種

>>> x = {}

>>> y = x

>>> x[‘key‘] = ‘value‘

>>> y

{‘key‘: ‘value‘}

>>> x.clear()

>>> y

{}

>>>

兩種情況中,x和y最初對應同一個字典。情況1中,我通過將x關聯到一個新的空字典來清空它,這對y一點影響也沒有,它還關聯到原先的字典。這可能是所需要的行為,但是如果真的想清空原始字典中所有的元素,必須使用clear方法。


2.copy

copy方法返回一個具有相同鍵-值對的新字典。這個方法實現的是淺複製,因為值本身就是相同的,而不是副本


>>> x = {‘username‘:‘admin‘,‘machines‘:[‘foo‘,‘bar‘,‘baz‘]}

>>> y = x.copy()

>>> y[‘username‘] = ‘mlh‘

>>> y[‘machines‘].remove(‘bar‘)

>>> y

{‘username‘: ‘mlh‘, ‘machines‘: [‘foo‘, ‘baz‘]}

>>> x

{‘username‘: ‘admin‘, ‘machines‘: [‘foo‘, ‘baz‘]}

>>>

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

避免這個問題的一種方法就是使用深複製,複製其包含所有的值。可以使用copy模組的deepcopy函數來完成操作:


>>> from copy import deepcopy

>>> d = {}

>>> d[‘names‘] = [‘Alfred‘,‘Bertrand‘]

>>> c = d.copy()

>>> dc = deepcopy(d)

>>> d[‘names‘].append(‘Clive‘)

>>> c

{‘name‘: [‘Alfred‘, ‘Bertrand‘]}

>>> dc

{‘name‘: [‘Alfred‘, ‘Bertrand‘]}

>>>


3.fromkeys

fromkeys方法使用給定的鍵建立新的字典,每個鍵預設對應的值為none

>>> {}.fromkeys([‘name‘,‘age‘])

{‘age‘: None, ‘name‘: None}

>>>

剛才的例子中首先構造了一個空字典,然後調用它的fromkeys方法,建立另外一個詞典---有些多餘。也可以直接在所有字典的類型dict上面調用方法。

>>> dict.fromkeys([‘name‘,‘age‘])

{‘age‘: None, ‘name‘: None}

>>>


如果不想使用None作為預設值,也可以自己提供預設值

>>> dict.fromkeys([‘name‘,‘age‘,‘(unknown)‘])

{‘(unknown)‘: None, ‘age‘: None, ‘name‘: None}

>>>



4.get

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

>>> d = {}

>>> print d[‘name‘]

Traceback (most recent call last):

  File "<stdin>", line 1, in <module>

KeyError: ‘name‘

>>> print d.get(‘name‘)

None

>>>

可以看到,當使用get訪問一個不存在的鍵時,沒有任何異常,而得到了None值。還可以自訂 預設 值,替換None

>>> d.get(‘name‘,‘N/A‘)

‘N/A‘

>>>


如果鍵存在,get用起來就像普通的字典查詢一樣:

>>> d[‘name‘] = ‘Eric‘

>>> d.get(‘name‘)

‘Eric‘

>>>


4-2 字典方法樣本

#!/usr/bin/env python

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)


5.has_key

has_key方法可以檢查字典中是否含有給出的鍵。運算式d.has_key(k)相當於運算式k in d。使用哪個方式很大程度上取決於個人的喜好。

>>> d = {}

>>> d.has_key(‘name‘)

False

>>> d[‘name‘] = ‘Eric‘

>>> d.has_key(‘name‘)

True

>>>


6.items 和 iteritems

items方法將所有的字典項以列表方式返回,這些清單項目中的每一項都來自於(鍵,值)。但是項在返回時並沒有特殊的順序


>>> d = {‘title‘:‘python web site‘,‘url‘:‘http://www.python.org‘,‘spam‘:0}

>>> d.items()

[(‘url‘, ‘http://www.python.org‘), (‘spam‘, 0), (‘title‘, ‘python web site‘)]



iteritems方法的作用大致相同,但是會返回一個迭代器對象而不是列表

>>> it = d.iteritems()

>>> it

<dictionary-itemiterator object at 0x7fc097934890>

>>> list(it)

[(‘url‘, ‘http://www.python.org‘), (‘spam‘, 0), (‘title‘, ‘python web site‘)]


7.keys和iterkeys

keys方法將字典中的鍵以列表形式返回,而iterkeys則返回針對鍵的迭代器


8.pop

pop方法用來獲得對應於給定鍵的值,然後將這個鍵-值對從字典中移除。


>>> d = {‘x‘:1,‘y‘:2}

>>> d.pop(‘x‘)

1

>>> d

{‘y‘: 2}

>>> d.pop(‘y‘)

2

>>> d

{}

>>>


9.popitem

popitem方法類似於list.pop,後者會彈出列表的最後一個元素。但不同的是,popitem彈出隨機的項,因為字典並沒有”最後的元素“或者其他有關順序的概念。若想一個接一個地移除並處理項,這個方法就非常有效了

>>> d = {‘url‘:1,‘spam‘:2,‘title‘:3}

>>> d.popitem()

(‘url‘, 1)

>>> d

{‘title‘: 3, ‘spam‘: 2}

>>>

儘管popitem和列表pop方法很類似,但字典中沒有與append等價的方法。因為字典是無序的,類似於append的方法是沒有任何意義的


10.setdefault

setdefault方法在某種程度上類似於get方法,就是能夠獲得與給定鍵相關聯的值,除此之外,setdefault還能在字典中不含有給定鍵的情況下設定相應的索引值。

>>> d = {}

>>> d.setdefault(‘name‘,‘N/A‘)

‘N/A‘

>>> d

{‘name‘: ‘N/A‘}

>>> d[‘name‘] = ‘Gumby‘

>>> d.setdefault(‘name‘,‘N/A‘)

‘Gumby‘

>>> d

{‘name‘: ‘Gumby‘}

>>>

可以看到,當鍵不存在的時候,setdefault返回預設值並且相應地更新字典。如果鍵存在,那麼就返回與其對應的值,但不改變字典。預設值是可選的,這點和get一樣。如果不設定,會預設使用None。


>>> d = {}

>>> print d.setdefault(‘name‘)

None

>>> d

{‘name‘: None}

>>>


11.update

update方法可以利用一個字典項更新另外一個字典:

>>> d = {‘title‘:‘python web site‘,‘uil‘:‘http://www.baidu.com‘,‘changed‘:‘Mar 14 22:09:15 MET 2008‘}

>>> x = {‘title‘:‘python language website‘}

>>> d.update(x)

>>> d

{‘changed‘: ‘Mar 14 22:09:15 MET 2008‘, ‘uil‘: ‘http://www.baidu.com‘, ‘title‘: ‘python language website‘}

>>>


提供的字典中的項會被添加到舊的字典中,若有相同的鍵則會進行覆蓋。

update方法可以使用與調用dict函數同樣的方式進行調用,這點在本章前面已經討論,這就意味著update可以和映射,擁有(鍵,值)對的隊列(或者其他迭代的對象)以及關鍵字參數一起調用。


12.values和itervalues

values方法以列表的形式返回字典中的值(itervalues傳回值的迭代器)。與返回鍵的列表不同的是,傳回值得列表中可以包含重複的元素:


>>> d = {}

>>> d[1] = 1

>>> d[2] = 2

>>> d[3] = 3

>>> d[4] = 1

>>> d.values()

[1, 2, 3, 1]

>>>


本文出自 “linux_oracle” 部落格,請務必保留此出處http://pankuo.blog.51cto.com/8651697/1634653

python之字典

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.