创建和使用字典
phone = {"王林":151515151,"刘涛":15151515,"蔡明":151515151585};
print phone["王林"];
输出的结果为:151515151
字典是由多个键及其对应的值构成的键值对组成(我们把键值对成为项)。空字典可以直接用 {} 直接来定义。字典中的键是唯一的。
dict函数
items = [("name","wanglin"),("age",23)];
d = dict(items);
print d;
输出的结果为:{‘age’: 23, ‘name’: ‘wanglin’}
通过dict函数把其他字典或者键值对建立字典。如果dict中的参数为空,则建立 {} 字典。
基本字典操作
len() 返回其中项的数量
d[K] 返回关联到键K的值
d[K] = V 把V的值关联到d[K]上
del d[K] 删除键值为d[K]的值
K in d 检查d中是否含有键为K的值。
下面是对上述方法的实现:
phoneNum = {"王琳":15151515,"刘涛":5151515,"蔡明":855522};
print "phoneNum的长度为:",len(phoneNum);
输出的结果为:phoneNum的长度为: 3
print phoneNum["王琳"];
输出的结果为:15151515
phoneNum["刘涛"] = 56565565656;
print phoneNum["刘涛"];
输出的结果为:56565565656
del phoneNum["蔡明"];
print "phoneNum的长度为:",len(phoneNum);
输出的结果为:phoneNum的长度为: 2
if "王琳" in phoneNum:
print "匹配到值";
else:
print "无法匹配";
输出结果为:匹配到值
##字典的格式化字符串
phoneNum = {"王健":1519206XXXX,"刘涛":1586301XXXX,"蔡冲":1835361XXXX};
print "王健的电话号码是 %(王健)s " % phoneNum
输出的结果为:王健的电话号码是 1519206XXXX
template = '<html><head><title>%(title)s</title></head><body><h1>%(title)s</h1><p>%(text)s</p></body></html>'
data = {"title":"我的首页","text":"欢迎来到我的主页!"}
print template % data
输出的结果为:<html><head><title>我的首页</title></head><body><h1>我的首页</h1><p>欢迎来到我的主页!</p></body></html>
字典方法
###1、clear
clear 方法清楚字典中所有的项。这个是原地操作(类似于list.sort),所以无返回值(或者说返回None)
data = {"title":"我的首页","text":"欢迎来到我的主页!"}
print data.clear()
输出的结果为:None
###2、copy
copy方法返回一个人具有相同键值对的新字典(这个方法的实现是浅复制) 那么是什么叫做浅复制?
x = {"title":"my page","text":["1","2","3"]}
y = x.copy()
print y
y["text"].remove("3")
print y
print x
输出的结果为:
{'text': ['1', '2', '3'], 'title': 'my page'}
{'text': ['1', '2'], 'title': 'my page'}
{'text': ['1', '2'], 'title': 'my page'}
由此可见,当修改了副本中的某个值的时候(不是替换)原始的字典也会改变,因为同样的值也存储的原字典中,避免这种问题的出现就要使用深复制,复制其包含的所有的值,可以使用copy模块的deepcopy函数来完成操作。
from copy import deepcopy
d = {}
d["name"] = ["wangjian","wanglin"]
c = d.copy()
dc = deepcopy(d)
d["name"].append("liutao")
print "浅复制的结果为:",c
print "深复制的结果为:",dc
输出的结果为:浅复制的结果为: {'name': ['wangjian', 'wanglin', 'liutao']}
深复制的结果为: {'name': ['wangjian', 'wanglin']}
###3、fromkeys
fromkeys方法使用给定的键建立新的字典,每个键都对应一个默认的值None
print dict.fromkeys(["name","age"])
输出的结果为:{'age': None, 'name': None}
###4、get
get方法是个更宽松的访问字典项的方法,一般来说,如果试图访问字典中的不存在的项时会出错。
d = {}
print d.get("name")
输出的结果为:None
当使用get访问一个不存在的键时,没有任何异常,而得到了None值,还可以自定义默认值替换None
print d.get("age","N/A")
输出的结果为:N/A
people= {
"wangjian":{
"phone":"33334",
"addr":"address"
},
"liutao":{
"phone":"42342",
"addr":"3453534"
},
"caiming":{
"phone":"423423",
"addr":"2423423432"
}
}
labels = {
"phone":"phone number",
"addr":"address"
}
name = raw_input("请输入姓名:")
查找电话号码还是地址
request = raw_input("请输入p(phone)或者a(address)")
使用正确的键
key = request
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)
输出的结果为:
请输入姓名:wanglin
请输入p(phone)或者a(address)p
wanglin's phone number is not available
###5、has_key
has_key方法可以检查字典中是否含有特定的键值。表达式d.has_key(k)相当于表达式k in d. python3中不包含这个函数
d = {}
print d.has_key("name")
程序的运行结果为:False
###6、items和iteritems
items方法将字典中所有的项以列表的方式返回,列表中的每一项都表示为(键、值)对应的形式。但是项在返回时没有特定的顺序。
d = {"name":"wanglin","age":23,"sex":"man"}
print d.items()
程序运行输出的结果为:[('age', 23), ('name', 'wanglin'), ('sex', 'man')]
iteritems方法的作用大致相同,但是会返回一个迭代器对象而不是列表
print d.iteritems()
程序输出的结果为:<dictionary-itemiterator object at 0x000000000340FA48>
由此看见程序输出的东西,是一串我们看不懂的16进制编码 那么怎么才能转化成我们想要的东西呢?如下所示:
print list(d.iteritems())
通过list()我们可以得到我们想要的结果,结果如下所示:[('age', 23), ('name', 'wanglin'), ('sex', 'man')]
###7、keys和iterkeys
keys方法将字典中的键以列表的形式返回,而iterkeys则返回针对键的迭代器
print d.keys()
print list(d.iterkeys())
程序的运行结果为:
['age', 'name', 'sex']
['age', 'name', 'sex']
###8、pop
pop方法用来获得对应于给定键的值,然后将这个键值对从字典中移除
d = {"x":1,"y":2}
d.pop("x");
print d
程序的运行结果为:{'y': 2}
###9、popitem
popitem方法类似于list.pop,后者弹出列表的最后一个元素,但是不同的是,popitem弹出随机的项,因为字典中没有"最后的元素"或者其他有关顺序的概念。若想一个接一个地移除并处理项,这个方法就非常有效。
d = {"x":1,"y":2,"m":3,"n":4}
d.popitem()
print d
程序的运行结果如下所示:{'x': 1, 'm': 3, 'n': 4}
###10、setdefault
setdefault方法在某种程度上类似于get方法,能够获得与给定键相关联的值,除此之外,setdefault还能在字典中不含有给定键的情况下设定相应的键值。
d = {}
d.setdefault("name","N/A")
print d
d["name"] = "wanglin"
d.setdefault("name","N/A")
print d
程序的运行结果为:
{'name': 'N/A'}
{'name': 'wanglin'}
由程序的运行结果可以看到,当键不存在的时候,setdefault返回默认的值并相应的更新字典。如果键存在,那么就返回与其对应的值,但是不改变字典,默认值是可选的。
###11、update
update方法可以利用一个字典项更新另外一个字典。
d = {"x":1,"y":2}
x = {"x":12}
d.update(x)
print d
print x
程序的运行结果为:{'y': 2, 'x': 12}
###12、values和itervalues
values方法以列表的形式返回字典中的值,与返回键的列表不同的是,返回值的列表可以包含重复的元素。
d = {}
d[1] = 1
d[2] = 2
d[3] = 3
d[4] = 1
print d.values()
print list(d.itervalues())
程序运行的结果为:
[1, 2, 3, 1]
[1, 2, 3, 1]