Python 字典:当索引不好用时

字典:当索引不好用时

我们已经了解到,列表这种数据结构适用于将值组织到一个结构中,并且通过编号对其引用。本章学习一种通过`名字来引用值的数据结构。这种类型的数据结构称为映射。字典是Python中唯一内建的映射类型。字典中的值并没有特殊的顺序,但是都储存在一个特定的键(Key)下。键可以是数字、字符串甚至是元组。

字典的使用

构造字典的目的,不管是现实中的字典还是在Python中的字典,都是为了可以通过轻松查找某个特定的词语(键),从而找到它的定义(值)。

假如有一个人名列表,如果要创建一颗可以储存这些人的电话号码的小型数据库,建立了这些列表后,可以通过如下方式查找Cecil的电话号码:

names = ['Alice','Beth','Cecil','Dee-Dee','Earl']
numbers = ['2341','9102','1234','2345','2354']
print numbers[names.index('Cecil')]
输出:

1234

虽然这样可行,但是并不实用。

创建和使用字典

<pre name="code" class="python">phonebook = {'Alice' :'1234' , 'Beth':'2345','Cecil':'3258'}
print phonebook['Alice']

 输出: 

1234

dict函数:

可以用dict函数,通过其他映射或者对的序列建立字典。

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

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


基本字典操作:

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

len(d)返回d中的项(键-值对)的数量;

d[k]返回关联到键k上的值;

d[k]=v将值v关联到键k上;

del d[k]删除键为k的项;

k in d检查d中是否有含有键为k的项。

键类型:字典的键不一定是整型数据,键可以是任意的不可变类型,比如浮点型、字符串或者元组。

自动添加:即使键起初在字典中并不存在,也可以为他赋值,这样字典就会建立新的项。而不能将值关联到列表范围之外的索引上。

成员资格:表达式k in d(d为字典)查找的是键,而不是值。

x = {}
x[42] = 'Foobar'
print x
输出:
{42: 'Foobar'}

# _*_coding:utf8_*_
#一个简单的数据库
#字典使用人名作为键。每个人用另一个字典表示、其键‘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:')

#查找电话号码还是地址?
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])
输出:
Name:Beth
Phone number (p) or address (a)?p
Beth's phone number is 9102.

字典的格式化字符串:

phonebook = {'Alice' :'1234' , 'Beth':'2345','Cecil':'3258'}
print "Cecil's phone number is %(Cecil)s." % phonebook
输出:

Cecil's phone number is 3258.

字典方法:

1、clear

clear方法清除字典中所有选项。这是个原地操作(类似于list.sort),所以无返回值。

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

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

2、copy

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

副本中替换值时不影响原始字典,如果修改(原地修改)了某个值,则原始字典受到了影响。

为避免这个问题,使用deep copy

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

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

3、fromkeys

fromkeys方法使用给定的键建立新的字典,每个键都对应一个默认的值None。

a = {}.fromkeys(['name','age'])
print a
输出:
{'age': None, 'name': None}

4、get

get方法是个更宽松的访问字典项的方法。一般来说,如果试图访问字典中不存在的项时会出错,而用get就不会:

d = {}
print d.get('name')
输出:
None

# coding:utf:8
#使用get()的简单数据库
#这里添加代码清单4-1中插入数据库的代码
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:')

#查找电话号码还是地址?
request = raw_input('Phone number (p) or address (a)?')

#使用正确的键:
key = request #如果请求既不是‘p’也不是‘a’
if request == 'p':key = 'phone'
if request == 'a':key = 'addr'

#使用get()提供默认值:
persen = people.get(name,{})
label = labels.get(key,key)
result = persen.get(key,'not avalable')

print "%s's %s is %s." % (name,label,result)
输出:
Name:Gumby
Phone number (p) or address (a)?batting average
Gumby's batting average is not avalable.

5、has_key

has_key方法可以检查字典中是否有特定的键。表达式d.has_key(k)相当于k in d。使用哪个方式很大程度上取决于个人的喜好。Python3.0中不包括这个函数。

d = {}
e = {}
e['name'] = 'ESC'
print d.has_key('name')
print e.has_key('name')
输出:

False
True

6、items和iteritems

items方法将字典所有的项以列表方式返回,列表中的每一项都表示为(键,值)对的形式。但是项在返回时并没有遵循特定的次序。

d = {'title':'Python Web Site','url':'http://python.org','spam':0}
print d.items()
输出:

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

iteritems方法的作用大致相同,但是会返回一个迭代器对象而不是列表。

d = {'title':'Python Web Site','url':'http://python.org','spam':0}
it = d.iteritems()
print it
print list(it)
输出:
<dictionary-itemiterator object at 0x7f4dd3ad78e8>
[('url', 'http://python.org'), ('spam', 0), ('title', 'Python Web Site')]

7、keys和iterkeys

keys方法将字典中的键以列表方式返回,而iterkeys则返回针对键的迭代器

8、pop

pop方法用来获得对应于给定键的值,然后将这个键-值对从字典中移除。

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

9、popitem

popitem方法类似于list.pop,后者会弹出列表的最后一个元需。但不同的是,popitem弹出随机的项,因为字典里没有最后的元素或者有关顺序的的概念。

d = {'x':1,'y':2}
print d.popitem()
print d
输出:

('y', 2)
{'x': 1}

10、setdefault

setdefault方法在某种程度上类似于get的方法,能够获得与给定键相关联的值,除此之外,setdefault还能在字典中不含有给定键的情况下设定相应的键值。如果不设定相应键值,项本身也没有键值,则返回None。

d = {}
print d.setdefault('name','N/A')
print d
d['name'] = 'Gumby'
print d.setdefault('name','N/A')
print d
输出:
N/A
{'name': 'N/A'}
Gumby
{'name': 'Gumby'}

11、update

update方法可以利用一个字典项更新另一个字典。若有相同的键将覆盖。

d = {'title':'Python web site',
     'url':'http://www.python.org',
     'changed':'Mar 14 22:09:15 MET 2008'
     }
x = {'title':'Python Language Website'}
d.update(x)
print d
输出:

{'url': 'http://www.python.org', 'changed': 'Mar 14 22:09:15 MET 2008', 'title': 'Python Language Website'}

12、values和itervalues

values方法以列表的形式返回字典中的值(iertvalues返回值的迭代器)。与返回键的列表不同的是,返回值的列表中可以包含重复的元素。

d = {}
d[1] = 1
d[2] = 2
d[3] = 3
d[4] = 1
print d.values()
输出:

[1,2,3,1]

本章的新函数
dict(seq)用(键、值)对(或者映射和关键字参数)建立字典





  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值