《Python 基础教程》学习笔记——字典

字典:Python中唯一内建的映射类型

-----------创建字典----------

phonebook = {'Alice':'2341','Beth':'9102','Cecil':'3258'}
print phonebook['Alice']

可以用dict函数,通过其他映射(比如其他字典)或者(键,值)这样的序列对建立字典

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

dict函数也可以通过关键字参数来创建字典

d = dict(name='Gumby',age = 42)
print d

-----------基本字典操作----------

字典的基本行为在很多方面与序列类似:

print len(d) #返回d中项(键-值对)的数量
print d['name']#获取字典d中键为'name'的值
d['name'] = 'Tom'#将值'Tom'关联到键'name'上
del d['name'] #删除键为'name'的项
'name' in d #检查d中是否含有键为'name'的项

字典与序列不同之处

1.键类型:字典中的键就类似于序列中的索引,但是序列的索引必须为整型数据,而字典 #的键可以为任意一种不可变类型,如浮点型、字符串、元组 。

2.自动添加:即使那个键起初在字典中并不存在,也可以为它分配一个值,这样字典就会建立 #新的项。而(在不使用append方法或者其他类似操作的情况下)不能将值关联到列表范围之外的索引上。

3.成员资格:表达式 k in d(d为字典)查找的是键,而不是值。表达式v in l(l为列表)则用来查找值 而不是索引。

字典示例——简单数据库

使用人名作为键的字典。每个人用另外一个字典来表示,其键’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: ')
#查找电话号码还是地址?('p':查询电话号码,'a':查询地址)
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])

-----------字典的格式化字符串--------

--

在每个转换说明符中的%字符后面,可以加上(用圆括号扩起来的)键,后面再跟上其他说明元素

phonebook = {'Alice':'2341','Beth':'9102','Cecil':'3258'}
print "Cecil's phone number is %(Cecil)s" % phonebook
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

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

1.clear:清除字典中的所有项,无返回值,或者说返回值为None,#如果x与y对应同一个字典,那么
x = {} 只会清空x,而对y不会有任何影响 #x.clear()则会把x,y都清空

d = {}
d['name'] = 'Gumby'
d['age'] = 42
print d
returned_value = d.clear()
print d
print returned_value

2.copy:返回一个具有相同键-值对的新字典(这个方法实现的是浅拷贝)

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

可以看到,当在副本中替换值的时候,原始字典不受影响,但是,如果修改了某个值(原地修改,而不是替换) 原始的字典也会改变,因为同样的值也存储在原字典中,避免该问题的一种方法就是使用深复制:deepcopy函数

from copy import deepcopy
d = {}
d['names'] = ['Alfred','Bertrand']
c = d.copy()
dc = deepcopy(d)
d['names'].append('Clive')
print c
print dc

3.fromkeys:使用给定的键创建新的字典,每个键默认对应的值为None

{}.fromkeys(['name','age'])
dict.fromkeys(['name','age'])

如果不想使用None作为默认值,也可以自己提供默认值

dict.fromkey(['name','age'],'unknown')

4.get:一个更宽松的访问字典项的方法,在试图访问字典中不存在的项是不会报错,会返回None

d = {}
print d.get('name')

还可以让get函数返回自定义的默认值

print d.get('name','N/A')

如果键存在于字典中,那个就会返回键对应的值

d['name'] = 'Eric'
print d.get('name')

字典方法示例——使用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: ')
#查找电话号码还是地址?('p':查询电话号码,'a':查询地址)
request = raw_input('Phone number(p) or address(a)?  ')
if request == 'p':key = 'phone'
if request == 'a':key = 'addr'

key = request
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:检测字典中是否含有给出的键 d.has_key(k)相当于表达式k in d,Python 3.0中不包括这个函数

d = {}
print d.has_key('name')
d['name'] = 'Eric'
print d.has_key('name')

6.items和iteritems

items方法将所有的字典项以列表的形式返回,列表的每一项是一个元组,对应于字典中的一个 #键-值对,返回时没有特殊的顺序

d = {'tilte':'Python Web Site','url':'http:\\www.python.org','spam':0}
print d.items()

iteritems方法的作用大致相同,不过它返回一个迭代器对象,但是它更高效

print d.iteritems()

7.keys和iterkeys

keys方法将字典中的键以列表的形式返回

d = {'name':'Alice','age':20}
print d.keys()

iterkeys返回针对键的迭代器

8.pop:用来获得对应于给定键的值,并将这个键-值对从字典中删除

d = {'x':1,'y':2}
print d.pop('x')
print d

9.popitem :随机的从字典中删除一个键-值对,并返回’值’

d = {'tilte':'Python Web Site','url':'http:\\www.python.org','spam':0}
print d.popitem()
print d

10.setdefault:获取给定键相应的值,如果键不存在,则默认返回None,并将该键和None组成“键-值对,添加到字典中

d = {'name':'Tom'}
print d.setfault('name')
print d

print d.setfault('age')
print d

11.update:利用一个字典项更新另外一个字典

d = {'title':'Python Web Site','url':'http:\\www.python.org','changed':'Mar14 22:09:15 MET 2008'}
x = {'title':'Python Language Website'}
d.update(x)
print d

12.values和itervalues

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

d = {}
d[1] = 1
d[2] = 2
d[3] = 3
d[4] = 1
print d.values()
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值