python基础之字典

我们之前学到过,用编号可以对列表经行索引,但是有些时候往往不能通过标号经行索引,可能需要使用字符串之类的类型经行索引。比如:我们需要通过姓名查找电话号码。那么使用列表就会相对麻烦。对于列表我们需要这样做:

>>> name=['a','b','c']
>>> num=['1','2','3']
>>> num[name.index('b')]
'2'

这样做显然比较麻烦,这里我们就可以使用字典

(注意:这个例子中可能有人会问为什么电话号码需要用字符串类型存储,想象一个如果a的号码是0456会输出什么?没错,python会默认为八进制处理,所以这里我们需要使用字符串)

1.字典的创建

映射(mapping):映射是一种通过键(key)来引用值得数据结构。

字典就是python唯一内建的映射类型。

字典的创建可以通过下面的方式创建:

>>> phone={'a':'1','b':'2','c':'3'}

字典是由多个键与其对应的值构成的键-值对组成,我们也把键-值对称为项。

键和值之间由冒号(:)隔开,项之间由逗号(,)隔开,整个字典是由一对大括号括起来({}),空字典由两个大括号组成。

注意:字典中键是唯一的,而值并不唯一。


dict()函数

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

>>> item=[('a','b'),('1','2')]
>>> d=dict(item)
>>> d
{'a': 'b', '1': '2'}
>>> d['a']
'b'
>>> d['1']
'2'

dict函数可以把其他映射作为参数,并建立与其映射相同的字典。


2.字典的操作

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

  • len(d)返回d中项的数量
  • d[k]返回关联到k键上的值
  • d[k]=v将值v关联到键k上
  • del d[k]删除键位k的项
  • k in d 检查d中是否有含有键k的项(检查成员资格)

注意:k in d在字典中检查的是键,不是值,如果d不是字典是列表的话则检查的是值而不是索引

在使用字典时,要注意两点:

第一:键是任意不可变的类型

第二:看看下面的区别:

>>> f=[]
>>> f[42]='a'
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
IndexError: list assignment index out of range
>>> f={}
>>> f[42]='a'
>>> f
{42: 'a'}

程序试图将'a'关联到一个空列表中42号位置——这显然是不可能的,但是字典实现了!


例:电话本程序

#!/usr/bin/python2.6
#coding=UTF-8
# 小型电话本数据库
people={
'A':{
'phone':'222',
'addr':'a'
},
'B':{
'phone':'333',
'addr':'b'
},
'C':{
'phone':'444',
'addr':'c'
}
}
# 描述性标签,输出时候使用
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])

输入为:

[root@localhost python]# ./hello.py
Name:A
Phone number(p) or address(a)?p
A's phone number is 222.
[root@localhost python]# ./hello.py
Name:B
Phone number(p) or address(a)?a
B's address is b.


字典的格式化字符串

之前我们已经见过使用字符串格式化元组中的所有值。如果是字典,可以在每个转换说明符(conversion speifier)中的%字符后面加上键(用括号括起来)。后面在跟上其他说明元素:

>>> "A's phone is %(a)s" % phone
"A's phone is 2"

除了增加字符串键之外,转换说明符还是像以前一样工作:

>>> a={'1':'hello ','2':'word'}
>>> '%(1)s %(2)s' % a
'hello  word'


3.字典方法

字典也像其他内建类型一样,有自己的方法,下面是一些可能有用的方法:

(1)clear

clear方法清楚字典中所有的项。这个是原地操作,所以没有返回值,或者说返回值是none。

>>> a={'1':'2','2':'2'}
>>> a
{'1': '2', '2': '2'}
>>> a.clear()
>>> a
{}

(2)copy

copy方法返回一个具有一个相同键-值对的新字典(这个方法实现的是浅复制——shallow copy)。

>>> x={'username':'admin','way':['a','b']}
>>> y=x.copy()
>>> y['username']='john'
>>> y['way'].remove('b')
>>> x
{'username': 'admin', 'way': ['a']}
>>> y
{'username': 'john', 'way': ['a']}

可以看到,在副本的替换中,原始字典不受影响,但是如果想修改了某个值(原地修改而不是替换)

,原始字典也就会改变,因为同样的值也存储在原字典中,因为同样的值也存储在原字典中。

避免这个问题的一种方法就是使用深赋值(deep copy),赋值其包含的所有值。可以使用copy模块的deepcopy函数完成:

>>> d={'name':['a','b']}
>>> dc=deepcopy(d)
>>> dc['name'].append('c')
>>> d
{'name': ['a', 'b']}
>>> dc
{'name': ['a', 'b', 'c']}

(3)fromkeys

fromkeys方法使用给定键建立新的字典,每个键的键值为None

>>> {}.fromkeys(['a','b'])
{'a': None, 'b': None}

如果不想用None作为默认值,也可以自己指定默认值:

>>> {}.fromkeys(['a','b'],'1')
{'a': '1', 'b': '1'}

(4)has_key

has_key方法用于检查键是否存在,一定程度上类似与k in d

其余方法请查询python手册。http://python.usyiyi.cn/


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值