python學習筆記(字典)

來源:互聯網
上載者:User

標籤:

字典的使用

現實中的欄位及在python中的欄位都進行了構建,從而可以輕鬆查到某個特定的詞語(鍵),從而找到它的意義(值)。

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

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

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

#  數字電話/地址本

建立一個人名列表,以及四位的分機號碼:

>>> names=[‘Alice‘,‘Beth‘,‘Ceci‘,‘Dee-Dee‘,‘Earl‘]
>>> numbers=[‘2341‘,‘9102‘,‘3158‘,‘0412‘,‘5551‘]
>>> numbers[names.index(‘Ceci‘)]#通過此方法查詢
‘3158‘

 

建立和使用字典

字典可以通過下面的方式建立:

phonebook={‘Alice‘:‘2341‘,‘Beth‘:‘9102‘,‘Ceci‘:‘3158‘}

字典由多個鍵及與其對應的值構成,在上例中,名字是鍵,電話號碼是值。

 

dict函數

可以用dict 函數,通過其他映射(比如其他字典)或(鍵,值)這樣的序列對建立字典。

>>> itmes=[(‘name‘,‘Gumby‘),(‘age‘,42)]
>>> d=dict(itmes)
>>> d
{‘age‘: 42, ‘name‘: ‘Gumby‘}
>>> d[‘name‘]
‘Gumby‘

dict函數也可以通過關鍵字參數來建立字典,如下例所示
>>> d=dict(name=‘Gumby‘,age=42)
>>> d
{‘age‘: 42, ‘name‘: ‘Gumby‘}

 

基本字典操作

電話本例子

#簡單資料庫
#使用人名作為鍵的字典。每個人用一個字典來表示,其鍵‘phone’和‘addr’分別表示他們的電話號碼和地址。
people={
‘Alice‘:{
‘phone‘:‘2341‘,
‘addr‘:‘Foo drive 23‘
},
‘Beth‘:{
‘phone‘:‘9102‘,
‘addr‘:‘Bar street 42‘
},
‘Cecil‘:{
‘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])

 --------------------------------------------

Name: Beth
phone number(p) or address(a)?p
Beth‘s phone number is 9102.

 

字典的格式化字串

>>> phonebook={‘Beth‘:‘9102‘,‘Alice‘:‘2341‘,‘Cecil‘:‘3258‘}
>>> "Cecil‘s phone number is %(Cecil)s."%phonebook
"Cecil‘s phone number is 3258."

字典方法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‘
>>> x
{‘key‘: ‘value‘}
>>> x={}
>>> y
{‘key‘: ‘value‘}


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

copy

copy方法返回一個相同的具有索引值對的新字典

>>> x={‘username‘:‘admin‘,‘machines‘:[‘foo‘,‘bar‘,‘baz‘]}
>>> y=x.copy()
>>> y
{‘username‘: ‘admin‘, ‘machines‘: [‘foo‘, ‘bar‘, ‘baz‘]}
>>> y[‘username‘]=‘mlh‘
>>> y[‘machines‘].remove(‘bar‘)
>>> y
{‘username‘: ‘mlh‘, ‘machines‘: [‘foo‘, ‘baz‘]}
>>> x
{‘username‘: ‘admin‘, ‘machines‘: [‘foo‘, ‘baz‘]}

可以看到當替換副本字典某個值時時原字典不受影響,但當修改某個值時,原字典也受影響

避免這種問題的方法就是使用深複製(deep copy),複製其包含的所有的值,可以使用copy模組中的deepcopy函數來完成

>>> from copy import deepcopy
>>> d={}
>>> d[‘names‘]=[‘alfred‘,‘bertrand‘]
>>> c=d.copy()
>>> c
{‘names‘: [‘alfred‘, ‘bertrand‘]}
>>> dc=deepcopy(d)
>>> dc
{‘names‘: [‘alfred‘, ‘bertrand‘]}

>>> d[‘names‘].append(‘Clive‘)
>>> c
{‘names‘: [‘alfred‘, ‘bertrand‘, ‘Clive‘]}
>>> dc
{‘names‘: [‘alfred‘, ‘bertrand‘]}

 

fromkeys

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

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

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

 

get

get是個更寬鬆的訪問字典的方法

>>> d={}
>>> print d[‘name‘]

Traceback (most recent call last):
File "<pyshell#5>", line 1, in <module>
print d[‘name‘]
KeyError: ‘name‘
>>> print d.get(‘name‘)
None

>>> d.get(‘name‘,‘N/A‘)
‘N/A‘
>>> d[‘name‘]=‘Eric‘
>>> d.get(‘name‘)
‘Eric‘

字典方法樣本

#使用get()的簡單資料庫
people={
‘Alice‘:{
‘phone‘:‘2341‘,
‘addr‘:‘Foo drive 23‘
},
‘Beth‘:{
‘phone‘:‘9102‘,
‘addr‘:‘Bar street 42‘
},
‘Cecil‘:{
‘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 #如果請求的既不是‘p’也不是‘a’
if request ==‘p‘:key=‘phone‘
if request ==‘a‘:key=‘addr‘

#使用get()提供的預設值
person=people.get(name,{})
label=labels.get(key,key)
result=person.get(key,‘not available‘)
print "%s‘s %s is %s."%(name,label,result)

----------------------------------------

Name: Beth
phone number(p) or address(a)?batting average
Beth‘s batting average is not available.

 

has_key

has_key方法可以檢查字典中是否有給出的鍵

>>> d={}
>>> d.has_key(‘name‘)
False
>>> d[‘name‘]=‘Eric‘
>>> d.has_key(‘name‘)
True

 

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 0x02A87A80>
>>> 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}

>>> d.keys()
[‘url‘, ‘spam‘, ‘title‘]
>>> hs=d.iterkeys()
>>> hs
<dictionary-keyiterator object at 0x02A87A50>
>>> list(hs)
[‘url‘, ‘spam‘, ‘title‘]

 

pop

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

>>> d={‘x‘:1,‘y‘:2}
>>> d.pop(‘x‘)
1
>>> d
{‘y‘: 2}

 

popitem

popitem方法類似與list.pop,後者會彈出列表的最後一個元素,popitem則會彈出隨機項,因為字典沒有順序的概念

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

 

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

>>> d={}
>>> print d.setdefault(‘name‘)
None
>>> d
{‘name‘: None}

update

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

>>> d={‘title‘:‘python web site‘,‘url‘:‘http://wwww.python.org‘,‘changed‘:‘mar 14 22:09:15 met 2008‘}
>>> x={‘title‘:‘python language website‘}
>>> d.update(x)
>>> d
{‘url‘: ‘http://wwww.python.org‘, ‘changed‘: ‘mar 14 22:09:15 met 2008‘, ‘title‘: ‘python language website‘}

 

values和itervalues

values方法以列表的形式返回字典中的值,itervalues返回迭代器

>>> d={}
>>> d[1]=1
>>> d[2]=2
>>> d[3]=3
>>> d[4]=1
>>> d.values()
[1, 2, 3, 1]

>>> it=d.itervalues()
>>> it
<dictionary-valueiterator object at 0x028466F0>
>>> list(it)
[1, 2, 3, 1]

 

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.