python里clear和copy_python之字典
通過名字引用值得數(shù)據(jù)結(jié)構(gòu).這種結(jié)構(gòu)類型稱為映射.字典是python中唯一內(nèi)建的映射類型.字典中的值并沒有特殊的順序,但是都存儲在一個特定的鍵里.鍵可以是數(shù)字,字符串甚至是元組.
某些情況下,字典比列表更加適用:
1.表征游戲棋盤的狀態(tài),每個鍵都是由坐標(biāo)值組成的元組;
2.存儲文件修改次數(shù),用文件名作為鍵;
3.數(shù)字電話/地址薄
假如有一個人名列表如下:
>>> names = ['Alice','Beth','Cecil','Earl']
>>> numbers = ['3123','3125','5654','9877']
>>> numbers[names.index('Cecil')]
'5654'
>>>
看到這里讀者會疑問:為什么用字符串而不用整數(shù)表示電話號碼呢?
>>> 0142
98
>>>
因為進(jìn)制的原因 所以不能這樣使用
4.2 創(chuàng)建和使用字典
phonebook = {'Alice':'1234','Beth':4321}
字典由多個鍵與其對應(yīng)的值構(gòu)成的對組成. 名字是鍵 ?號碼是 值.
字典中的鍵是唯一的,而值并不是唯一的
4.2.1 dict函數(shù)
可以用dict函數(shù),通過其他映射或者這樣的序列對建立字典.
>>> items = [('name','Gumby'),('age',42)]
>>> d = dict(items)
>>> d
{'age': 42, 'name': 'Gumby'}
>>> d['name']
'Gumby'
>>>
dict函數(shù)也可以通過關(guān)鍵字參數(shù)來創(chuàng)建字典
>>> d = dict(name='Gumby',age=42)
>>> d
{'age': 42, 'name': 'Gumby'}
>>>
這可能是dict函數(shù)最有用的功能但是還能以映射作為dict函數(shù)的參數(shù),以建立其項與映射相同的字典(如果不帶任何參數(shù),則dict函數(shù)返回一個新的空字典,就像list,tuple以及str等函數(shù)一樣).如果另一個映射也是字典,也可以使用本章稍后講到的字典方法copy.
4.4.4 基本字典操作
字典的基本行為在很多方面與序列類似:
1.len(d)返回d中項的數(shù)量
2.d[k]返回關(guān)聯(lián)到鍵k上的值
3.d[k]=v將值v關(guān)聯(lián)到鍵k上
4.del d[k]刪除鍵為k的項
5.k in d檢查d中是否有含有鍵為k的項
盡管字典和列表有很多特性相同,但也有下面一些重要的區(qū)別.
鍵類型:字典的鍵不一定為整型數(shù)據(jù)(但也可能是),也可能是其他不可變類型,比如浮點型(實型),字符串或者元組.
自動添加:即使那個鍵起初在字典中并不存在,也可以為它分配一個值,這樣字典就會建立新的項。而不能將值關(guān)聯(lián)到列表范圍之外的索引上。
成員資格:表達(dá)式k in d (d為字典)查找的鍵,而不是值。表達(dá)式v in l(l為列表)則是用來查找值,而不是索引。
在字典中檢查鍵的成員資格比在列表中檢查值得成員資格更高效,數(shù)據(jù)結(jié)構(gòu)的規(guī)模越大,兩者的效率差距越明顯。
第一點---------鍵可以為任何不可變類型-----是字典最強(qiáng)大的地方。第二點也很重要。
>>> x = {}
>>> x[42] = 'Foobar'
>>> x
{42: 'Foobar'}
>>>
首先,程序試圖將字符串'Foobar'關(guān)聯(lián)到一個空列表的42號位置上--------這顯然是不可能的,因為這個位置根本不存在。為了將其變?yōu)榭赡?#xff0c;我必須用[None] * 43 或者其他方式初始化x,而不能僅使用[]。但是,下一個例子工作得很好。我將‘Foobar’關(guān)聯(lián)到空字典的鍵42上,沒問題!新的項已經(jīng)添加到字典中。
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])
執(zhí)行結(jié)果
[root@pankuo ~]# ./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."
>>>
除了增加的字符串鍵之外,轉(zhuǎn)換說明符還是像以前一樣工作.當(dāng)以這種方式使用字典的時候,只要所有給出的鍵都能在字典中找到,就可以獲得任意數(shù)量的轉(zhuǎn)換說明符.這類字符串格式化在模板系統(tǒng)中非常有用
>>> template = '''
...
%(title)s...
...
%(title)s
...
%(text)s
...
'''>>> data = {'title': 'My Home Page','text': 'Welcome to my home page'}
>>> print template % data
My Home PageMy Home Page
Welcome to my home page
>>>
4.2.4 ? 字典方法
就像其他內(nèi)建類型一樣,字典也有方法.這些方法非常有用,但是可能不會像使用列表或者字符串方法那樣頻繁地使用.
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最初對應(yīng)同一個字典。情況1中,我通過將x關(guān)聯(lián)到一個新的空字典來清空它,這對y一點影響也沒有,它還關(guān)聯(lián)到原先的字典。這可能是所需要的行為,但是如果真的想清空原始字典中所有的元素,必須使用clear方法。
2.copy
copy方法返回一個具有相同鍵-值對的新字典。這個方法實現(xiàn)的是淺復(fù)制,因為值本身就是相同的,而不是副本
>>> 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']}
>>>
可以看到,當(dāng)在副本中替換值得時候,原始字典不受影響,但是,如果修改了某個值(原地修改,而不是替換),原始的字典也會改變,因為同樣的值也存儲在原字典中。
避免這個問題的一種方法就是使用深復(fù)制,復(fù)制其包含所有的值。可以使用copy模塊的deepcopy函數(shù)來完成操作:
>>> 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方法使用給定的鍵建立新的字典,每個鍵默認(rèn)對應(yīng)的值為none
>>> {}.fromkeys(['name','age'])
{'age': None, 'name': None}
>>>
剛才的例子中首先構(gòu)造了一個空字典,然后調(diào)用它的fromkeys方法,建立另外一個詞典---有些多余。也可以直接在所有字典的類型dict上面調(diào)用方法。
>>> dict.fromkeys(['name','age'])
{'age': None, 'name': None}
>>>
如果不想使用None作為默認(rèn)值,也可以自己提供默認(rèn)值
>>> dict.fromkeys(['name','age','(unknown)'])
{'(unknown)': None, 'age': None, 'name': None}
>>>
4.get
get方法是個更寬松的訪問字典項的方法。一般來說,如果試圖訪問字典中不存在的項時會出錯:
>>> d = {}
>>> print d['name']
Traceback (most recent call last):
File "", line 1, in
KeyError: 'name'
>>> print d.get('name')
None
>>>
可以看到,當(dāng)使用get訪問一個不存在的鍵時,沒有任何異常,而得到了None值。還可以自定義 默認(rèn) 值,替換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á)式d.has_key(k)相當(dāng)于表達(dá)式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
>>> list(it)
[('url', 'http://www.python.org'), ('spam', 0), ('title', 'python web site')]
7.keys和iterkeys
keys方法將字典中的鍵以列表形式返回,而iterkeys則返回針對鍵的迭代器
8.pop
pop方法用來獲得對應(yīng)于給定鍵的值,然后將這個鍵-值對從字典中移除。
>>> d = {'x':1,'y':2}
>>> d.pop('x')
1
>>> d
{'y': 2}
>>> d.pop('y')
2
>>> d
{}
>>>
9.popitem
popitem方法類似于list.pop,后者會彈出列表的最后一個元素。但不同的是,popitem彈出隨機(jī)的項,因為字典并沒有”最后的元素“或者其他有關(guān)順序的概念。若想一個接一個地移除并處理項,這個方法就非常有效了
>>> d = {'url':1,'spam':2,'title':3}
>>> d.popitem()
('url', 1)
>>> d
{'title': 3, 'spam': 2}
>>>
盡管popitem和列表pop方法很類似,但字典中沒有與append等價的方法。因為字典是無序的,類似于append的方法是沒有任何意義的
10.setdefault
setdefault方法在某種程度上類似于get方法,就是能夠獲得與給定鍵相關(guān)聯(lián)的值,除此之外,setdefault還能在字典中不含有給定鍵的情況下設(shè)定相應(yīng)的鍵值。
>>> 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āng)鍵不存在的時候,setdefault返回默認(rèn)值并且相應(yīng)地更新字典。如果鍵存在,那么就返回與其對應(yīng)的值,但不改變字典。默認(rèn)值是可選的,這點和get一樣。如果不設(shè)定,會默認(rèn)使用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'}
>>>
提供的字典中的項會被添加到舊的字典中,若有相同的鍵則會進(jìn)行覆蓋。
update方法可以使用與調(diào)用dict函數(shù)同樣的方式進(jìn)行調(diào)用,這點在本章前面已經(jīng)討論,這就意味著update可以和映射,擁有(鍵,值)對的隊列(或者其他迭代的對象)以及關(guān)鍵字參數(shù)一起調(diào)用。
12.values和itervalues
values方法以列表的形式返回字典中的值(itervalues返回值的迭代器)。與返回鍵的列表不同的是,返回值得列表中可以包含重復(fù)的元素:
>>> d = {}
>>> d[1] = 1
>>> d[2] = 2
>>> d[3] = 3
>>> d[4] = 1
>>> d.values()
[1, 2, 3, 1]
>>>
總結(jié)
以上是生活随笔為你收集整理的python里clear和copy_python之字典的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 对外汉语语料库有哪些_国内语料库建设一览
- 下一篇: jsp快到截止日期字体颜色变色_jsp页