字典

# coding:utf-8html

#---------------------------------------------  建立和使用字典  ---------------------------------------------python


#電話簿示例app

names = ['Alice', 'Neth', 'Cecil', 'Dee-Dee', 'Earl']ide

numbers = ['2341', '9102', '3158', '0142', '5551']函數

print numbers[names.index('Cecil')]       ##查找Cecil電話,列表方式,但願字典方式:phonebook['Cecil']url

#3158spa


#字典方式htm

phonebook = {'Alice': '2341', 'Beth': '9102', 'Cecil': '3158'}   #名字是鍵,電話是值,鍵是惟一的,值不是惟一的。對象

print phonebook['Cecil']utf-8

#3158

#dict

#能夠用dict函數經過其餘映射或者對的序列創建字典

items = [('name', 'Gumby'), ('age', 42)]

d = dict(items)

print d

#{'age': 42, 'name': 'Gumby'}

d = dict(name='Gumby', age=42)      #也能夠經過關鍵字參數來建立字典

print d

#{'age': 42, 'name': 'Gumby'}

#x = []

#x[42] = 'foobar'   #字符串foor關聯到一個空列表42號位置上,顯然是不可能的,由於這個位置根本不存在。爲了將變成可能,我必須用[None]*43

x = {}

x[42] = 'foobar'   #字典能夠,我將'foobar'關聯到空字典的鍵42上

print x

#{42: 'foobar'}


#字典的格式化字符串

#若是使用的是字典(以字符串做爲鍵)而不是元組,使用字符串格式化方式更酷一些,在每一個轉換說明符中的%字符後面,能夠加上鍵(用圓括號括起來),後面再跟上其餘說明元素。

phonebook = {'Alice': '2341', 'Beth': '9102', 'Cecil': '3158'}

print "Cecil's phone number is %(Cecil)s." % phonebook        #百分號後面加上鍵(圓括號括起來)

#Cecil's phone number is 3158.

#當以這種方式使用字典的時候,只要全部給出的鍵都能在字典中找到,就可使用任意數量的轉換說明符。這類字符串格式化在模板系統中很是有用。

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例子,格式化模板很方便

#<html>

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

#<body>

#<h1>My Home Page</h1>

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

#</body>


#--------------------------------------------  字典方法  -------------------------------------------------------


#clear

#清除字典中全部的項。這是個原地操做(相似list.sort),因此無返回值(或者說返回None)

d = {}

d['name'] = 'Gumby'

d['age'] = 42

print d

#{'age': 42, 'name': 'Gumby'}

returned_value = d.clear()

print d

#{}

print returned_value

#None

x = {}

y = x

x['key'] = 'value'

print y

#{'key': 'value'}

x = {}          #x變量被清空

print y        #y變量字典仍然存在,若是想完全清空,就須要用到clear

#{'key': 'value'}

x = {}

y = x

x['key'] = 'value'

print y

#{'key': 'value'}

x.clear()

print x

#{}

print y         #x和y一塊兒被清空

#{}


#copy

#copy方法返回一個具備相同鍵-值對的新字典(這個方法實現的是淺複製,由於值自己就是相同的,而不是副本)。

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

y = x.copy()

print y

#{'username': 'admin', 'machines': ['foo', 'bar', 'baz']}

y['username'] = 'mlh'    #替換不會修改原始字典x變量

print y

#{'username': 'mlh', 'machines': ['foo', 'bar', 'baz']}

print x

#{'username': 'admin', 'machines': ['foo', 'bar', 'baz']}

y['machines'].remove('bar')     #修改某個值(原地修改,而不是替換),原始字典x變量也會改變

print y

#{'username': 'mlh', 'machines': ['foo', 'baz']}

print x

#{'username': 'admin', 'machines': ['foo', 'baz']}

#避免這個問題的一種方法就是使用深複製,複製其包含的全部值。可使用copy模塊的deepcopy函數來完成操做。


#deepcopy

#深複製

from copy import deepcopy       #導入copy模塊的deepcopy函數

d = {}

d['names'] = ['Alfred', 'Bertrand']

c = d.copy()

dc = deepcopy(d)

d['names'].append('Clive')     #原始字典變量d增長值

print d

#{'names': ['Alfred', 'Bertrand', 'Clive']}

print c                         #淺複製會一塊兒增長

#{'names': ['Alfred', 'Bertrand', 'Clive']}

print dc                        #深複製則不會改變

#{'names': ['Alfred', 'Bertrand']}


#fromkeys

#給定的鍵創建新字典,每一個鍵對應一個默認值None

print {}.fromkeys(['name', 'age'])         #它首先構造空字典,而後調用fromkeys方法創建另一個詞典---有些多餘。建議用dict方法

#{'age': None, 'name': None}

print dict.fromkeys(['name', 'age'])        #dict方法,效果和上面同樣。建議使用。

#{'age': None, 'name': None}

print dict.fromkeys(['name', 'age'], '(unknown)')      #若是不想使用None做爲默認值,也能夠本身提供默認值。

#{'age': '(unknown)', 'name': '(unknown)'}


#get

#更寬鬆的訪問字典方法,通常訪問不存在的項會報錯,get訪問不會報錯,獲得None

d = {}

#print d['name']       #這樣訪問會報錯

print d.get('name')  #get不會報錯,返回None

#None

print d.get('name', 'N/A')      #也能夠自定義None,改爲N/A,若是鍵在不會替換

#N/A

d['name'] = 'Eric'

print d.get('name')           #若是鍵存在,get用起來和普通字典查詢同樣

#Eric

print d.get('name', 'N/A')     #若是鍵存在,不會替換

#Eric

#has_key

#檢查有沒鍵

d = {}

print d.has_key('name')     #沒有鍵

#False

d['name'] = 'Eric'

print d.has_key('name')     #有鍵

#True


#items和iteritems

#items將字典全部的項以列表方法返回,列表中的每一項都表示爲(鍵,值)隊的形式。可是項在返回時並無遵循特定的次序。

d = { 'title': 'Python Web Site', 'url': 'http://www.python.org', 'spam': 0 }

print d.items()

#[('url', 'http://www.python.org'), ('spam', 0), ('title', 'Python Web Site')]

#iteritems方法的做用大體相同,可是會返回一個迭代器對象而不是列表:

it = d.iteritems()      #返回迭代器

print it

#<dictionary-itemiterator object at 0x00000000022B2A98>

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

print d.keys()          #將字典中的鍵以列表形式返回

#['url', 'spam', 'title']

it = d.iterkeys()          #返回迭代器

print it

#<dictionary-keyiterator object at 0x00000000022C2B38>

print list(it)      #轉換爲列表

#['url', 'spam', 'title']


#values和itervalues

#valuse方法以列表的形式返回字典中的值,與返回鍵的列表不一樣的是,返回值的列表中能夠包含重複的元素。itervalues則返回值的迭代器。

d = {}

d[1] = 1

d[2] = 2

d[3] = 3

d[4] = 1

print d.values()

#[1, 2, 3, 1]

it = d.itervalues()     #返回迭代器

print it

print list(it)      #轉換爲列表

#<dictionary-valueiterator object at 0x0000000002232B88>


#pop

#移除鍵和值

d = {'x': 1, 'y': 2}

d.pop('x')            #刪除x鍵和值

print d

#{'y': 2}


#popitem

#隨機刪除

d = {'x': 1, 'y': 2 ,'z': 3}

d.popitem()           #隨機刪除一個,好處不用指定鍵,字典沒有順序概念,若想一個個移除,這個方法很是有效。

print d

#{'x': 1, 'z': 3}


#setdefault

#相似get方法,在沒有鍵狀況下能夠設定相應鍵

d = {}

d.setdefault('name', 'N/A')

print d

#{'name': 'N/A'}

d['name'] = 'Gumby'

d.setdefault('name', 'N/A')               #有鍵不會替換

print d

#{'name': 'Gumby'}


#update

#一個字典更新到另外一個字典

d = {

   'x': '1',

   'y': '2',

   'z': '3'

}

e = {'a': '4'}

d.update(e)

print d

#{'y': '2', 'x': '1', 'z': '3', 'a': '4'}


#涉及的函數

#dict(seq)                  用(鍵,值)對(或者映射和關鍵字參數)創建字典

相關文章
相關標籤/搜索
本站公眾號
   歡迎關注本站公眾號,獲取更多信息