首页 > 程序开发 > Web开发 > Python >

python 系统学习笔记(五)---字典

2013-03-12

字典类似于你通过联系人名字查找地址和联系人详细情况的地址簿,即,我们把键(名字)和值(详细情况)联系在一起。注意,键必须是唯一的,就像如果有两个人恰巧同名的话,你无法找到正确的信息。注意,你只能使...

字典类似于你通过联系人名字查找地址和联系人详细情况的地址簿,即,我们把键(名字)和值(详细情
况)联系在一起。注意,键必须是唯一的,就像如果有两个人恰巧同名的话,你无法找到正确的信息。
注意,你只能使用不可变的对象(比如字符串)来作为字典的键,但是你可以不可变或可变的对象作为字
典的值。基本说来就是,你应该只使用简单的对象作为键。
键值对在字典中以这样的方式标记:d = {key1 : value1, key2 : value2 }。注意它们的
键/值对用冒号分割,而各个对用逗号分割,所有这些都包括在花括号中。
记住字典中的键/值对是没有顺序的。如果你想要一个特定的顺序,那么你应该在使用前自己对它们排序。
字典是dict类的实例/对象。
dictionary: 字典(即C++标准库的map)
dict = {'ob1':'computer', 'ob2':'mouse', 'ob3':'printer'}
每一个元素是pair,包含key、value两部分。key是Integer或string类型,value 是任意类型。
键是唯一的,字典只认最后一个赋的键值。
通过键来存取,而非偏移量;
键值对是无序的;
键和值可以是任意对象;
长度可变,任意嵌套;
在字典里,不能再有序列操作,虽然字典在某些方面与列表类似,但不要把列表套在字典上
字典的创建
1.直接创建: phonebook={'Alice':'2341','Beth':'9102','Cecil':'3258'} (键和值用冒号隔开,各个键值对键用逗号隔开)
2.dict函数:
>>>items=[('name','Gumby'),('age',42)] #dict的第一种方法
>>>d=dict(items)
{'age':42,'name':'Gumby'}
>>>d=dict(name='Gumby',age=42) #dict的第二种方法
{'age':42,'name':'Gumby'}
>>>d['***al']='boy'
{'age':42,'name':'Gumby','***ual':'boy'}
*字典的格式化字符串* (很有用)
在转换说明符中的%字符后面,可以加上用圆括号括起来的键,后面再更其他说明元素。
phonebook={'Alice':'2341','Beth':'9102','Cecil':'3258'}
print "Alice's phone number is
%(Alice)s,Cecil's phone number is %(Cecil)s"%phonebook #%(Alice)s的s表示输出字符串的意思
-->Alice's phone number is 2341,Cecil's phone number is 3258
注:这类字符串格式化在模板系统中非常有用,string.Template类对于这类应用也是非常有用的。
字典的方法
1.clear
清除字典中的所有项:
phonebook.clear() #phonebook是一个字典对象
2.copy
浅复制:只复制字典中的父对象,对子对象采取引用的办法。改变子对象的内容会影响到复制和被复制的字典。
例:
x={'username':'admin','machines':['foo','bar','baz']}
y=x.copy()
y['username']='Allen'
y['machines'].remove('bar')
print y
print x
输出:
{'username':'Allen','machines':['foo','baz']} #y
{'username':'admin','machines':['foo','baz']} #x 链表子对象中的值改变,会影响两个字典。子对象采取应用的方法。
深度复制:deepcopy,完全复制,新字典的改变不会影响原来的字典。
from copy import deepcopy
d={'username':'admin','machines':['foo','bar','baz']}
dc=deepcopy(d)
3.fromkeys
使用给定的键建立新的字典,每个键默认对应的值为None。
{}.fromkey(['name','age'])
-->{'age':None,'name':None}
dict.fromkey(['name','age']) #直接在所有字典的类型dict上调用方法
-->{'age':None,'name':None}
dict.fromkey(['name','age'],'(unknown)') #不用None作为默认值,自己提供默认值
-->{'age':'(unknown)','name':'(unknown)' }
4.get
get方法是一个更宽松的访问字典项的方法。一般来说,如果试图访问字典中不存在的项时会出错。而用get就不会。
例:
>>>d={} #空字典
>>>print d['name']
Traceback........ #出错信息
>>>print d.get('name')
None #可以自定义默认值代替None,如d.get('name','N/A'),如果没有name项就打印N/A
5.has_key
检查字典中是否含有给出的键。d.has_key(k)相当于k in d。Python3.0中不包含这个函数。
>>>d={'name':'fuss'}
>>>d.has_key('age')
False
>>>d.has_key('name')
True
6.items和iteritems
items方法将所有字典项以列表方式返回。
>>> d={'name':'fu','age':24,'***al':'boy'}
>>> d.items()
[('age', 24), ('name', 'fu'), ('***ual', 'boy')] #返回没有特殊的顺序
iteritems方法的作用大致相同,但是会返回一个迭代器对象而不是列表:
>>> it=d.iteritems()
>>> it
<dictionary-itemiterator object at 0x011DA580>
>>> list(it)
[(&#39;age&#39;, 24), (&#39;name&#39;, &#39;fu&#39;), (&#39;***ual&#39;, &#39;boy&#39;)]
7.keys和iterkeys
keys方法将字典中的键以列表的形式返回,而iterkeys则返回针对键的迭代器。
>>>d.keys()
[&#39;age&#39;, &#39;name&#39;, &#39;***ual&#39;]
8.pop
用来获得对应于给定键的值,然后将这个键值对从字典移除。
>>>d={&#39;x&#39;:1,&#39;y&#39;:2}
>>>d.pop(&#39;x&#39;)
1
>>>d
{&#39;y&#39;:2}
9.popitem
popitem方法类似于list.pop,后者会弹出列表的最后一个元素。但popitem弹出的是随机项,以为字典没有"最后的元素"或其他有关顺序的概念。
>>>d={&#39;x&#39;:1,&#39;y&#39;:2}
>>>d.popitem()
(&#39;x&#39;:1) #随机的
10.setdefault
setdefault方法在某种程度上类似于get方法,就是能获得与给定键关联的值,除此之外,setdefault还能在字典中不含有给定键的情况下设定相应的键值。
>>>d={}
>>>d.setdefault(&#39;name&#39;,&#39;N/A&#39;)
&#39;N/A&#39;
>>>d
{&#39;name&#39;:&#39;N/A&#39;}
>>>d[&#39;name&#39;]=&#39;Allen&#39;
>>>d.setdefault(&#39;name&#39;,&#39;N/A&#39;)
&#39;Allen&#39;
>>>d
{&#39;name&#39;:&#39;Allen&#39;}
11.update
update方法可以利用一个字典项更新另外一个字典:
>>>d={&#39;x&#39;:123,&#39;y&#39;:456}
>>>b={&#39;x&#39;:789}
>>>d.update(b)
>>>d
{&#39;x&#39;:789,&#39;y&#39;:456}
提供的字典项会被添加到旧的字典中,若有相同的键则会进行覆盖。
12.values和itervalues
values方法一列表的形式返回字典的值(itervalues返回值的迭代器)。与keys对比(对应关系)
例:
d={&#39;name&#39;:&#39;fu&#39;,&#39;age&#39;:24,&#39;***ual&#39;:&#39;boy&#39;}
print d.keys() #返回字典的键列表
print d.values() #返回字典的值列表
[&#39;age&#39;, &#39;name&#39;, &#39;***ual&#39;] #键列表
[&#39;fu&#39;,24,&#39;boy&#39;] #值列表
[python]
# -*- coding: cp936 -*-
params = {"server":"mpilgrim", "database":"master", "uid":"sa", "pwd":"secret"}
print params.keys()
print params.values()
print params.items()
print [ k for k, v in params.items()]
print [v for k, v in params.items()]
print ["%s=%s" % (k, v) for k, v in params.items()]
print params.has_key("server")
print params.get("server")
params["pwd"]="hello pwd"
print params.items()
params["hello list"]=[1,2,3,4]
print params
del params["hello list"]
print params
#print params.popitem()
#遍历
for key in params.keys():
print key, &#39;\t&#39;, params[key]
#join 连接
print ";".join(["%s=%s" % (k, v*2) for k, v in params.items()])
利用字典实现简单的switch 类型语句。(第一节的时候已经写了)
[python]
from __future__ import division
x = 1
y = 2
operator = "/"
result = {
"+" : x + y,
"-" : x - y,
"*" : x * y,
"/" : x / y
}
print result.get(operator)
练习题
颠倒字典中的键和值。用一个字典做输入,输出另一个字典,用前者的键做值,前者的
值做键。但是如果value 相同要求保留前一个
d={&#39;abc&#39;:1,&#39;def&#39;:2,&#39;ghi&#39;:3,&#39;jkl&#39;:3} =》{1:&#39;abc&#39;,2:&#39;def&#39;,3:&#39;ghi&#39;}
相关文章
最新文章
热点推荐