Python基础教程 第四章 字典-当索引不好用时

2017年11月13日20:49:01
  • A+
所属分类:Python基础

字典中的键是唯一的

 

创建和使用字典

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

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

 

 

4.2.1  dict函数

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

items=[('name', 'Gumby'),('age',427)]
a=dict(items)
print a
print a['name']

输出

C:\Python27\python.exe C:/Users/hspcadmin/PycharmProjects/untitled/MyData.py

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

Gumby

 

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

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

 

 

 

4.2.2基本字典操作

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

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

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

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

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

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

 

尽管字典和列表有很多特性相同,但也有下面一些重要的区别。

键类型: 字典的键不一定为整型数据,也可能是其他不可变类型,比如浮点型(实型)、字符串或者元组,键可以为任何不可变类型

自动添加: 即使那个键起初在字典中并不存在,也可以为它分配一个值,这样字典就会建立新的项。

而(在不使用append方法或者其他类似操作的情况下)不能将值关联到列表范围之外的索引上。

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

 

在字典中检查键的成员资格比在列表中检查值的成员资格更高效

 

>>>x一{}

>>>x[42〕=’Foobar'

>>>X

{42: 'Foobar'}  关联到空字典上,列表则不能这样操作

 

4.2.3字典的格式化字符串

Phonebook ={'Beth':'9102', 'Alice':'2341','Cecil':'3258'}
str2= "Cecil's phone number is %(Cecil)s$." % phonebook
print str2

输出:

Cecil's phone number is 3258$.

 

 

4.2.4字典方法

1、clear

clear方法清除字典中所有的项

x ={}
y =x
x['key'] ='value'
print y ,x
x={}
print y,x

输出

{'key': 'value'} {'key': 'value'}

{'key': 'value'} {}

 

 

x ={}
y =x
x['key'] ='value'
print y,x
x.clear()
print y,x

输出

{'key': 'value'} {'key': 'value'}

{} {}

 

 

说明 当x和y关联到同一个字典时,用clear方法情况其中一个,另一个也会情况,如果用x={}这种方式则不会

 

 

  1. copy

copy方法返回一个具有相同键-值对的新字典(这个方法实现的是浅复制(shal low copy ),因为值本身就是相同的,而不是副本)。

 

 

>>>x={'username':'admin'.'machines':['foo'.'bar','baz']}

>>>Y=x.copy()

>>>y['username']='mlh'

>>>y['machines'].remove('bar')

>>>y

{'username':'mlh','machines':['foo','baz'〕}

>>>X

{'username':'admin','machines':['foo','baz']}

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

原始的字典也会改变,因为同样的值也存储在原字典中(就像上面例子中的“machines”列表一样)。

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

>>>from copy import deepcopy

>>>d={}

>>>d['names']=['Alfred',’Bertrand']

>>>c = d.copy()

>>>do=deepcopy(d)

>>>d['names'].append('Clive')

>>>c

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

>>>do

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

 

  1. fromkeys

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

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

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

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

>>>dict.fromkeys(['name', 'age'], '(unknown)')

{'age',:'(unknown)', 'name':'(unknown)'}

 

  1. get

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

print d.get(name)

None

 

还可以自定义“默认”值,替换None:

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

'NIA'

 

print "%s's %s is %s.”% (name, label.result)

 

 

  1. has key

has_ key方法可以检查字典中是否含有给出的键。表达式d.has_ key(k)相当于表达式k in do使用哪个方式很大程度上取决于个人的喜好。Python 3.0中不包括这个函数。

>>>d={}

>>>d.has_key('name')

False

 

 

  1. items和iteritems

items方法将所有的字典项以列表方式返回,这些列表项中的每一项都来自于(键,值)。但是项在返回时并没有特殊的顺序。

>>>d = {'title':'Python Web Site'.'url’:'http://www.python.org', 'spam':o}

>>> d.items()

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

 

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

>>> it=d.iteritems()

>>>it

<dictionary-iterator object at 169050>

>>>list(it)   #Convert the iterator to a list

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

 

在很多情况下使用iteritems更高效(尤其是想要迭代结果的情况下

 

 

  1. keys和iterkeys

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

 

 

 

  1. pop

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

>>>d={'x':1. 'y':2}

>>>d.pop('x')

>>>d

{'y':2}

 

 

 

9.popitem

popi七em方法类似于list.pop,后者会弹出列表的最后一个元素。但不同的是,popi七em弹出随机的项,因为字典并没有“最后的元素”或者其他有关顺序的概念。若想一个接一个地移除并处理项,这个方法就非常有效了(因为不用首先获取键的列表)。

 

>>>d

{'url’:'http://www.python.org'.'spam':0. 'title':'Python Web Site'}

>>>d.popitem()

('url', 'http://www.python.org')

>>>d

{'spam':0 , 'title':'Python Web Site'}

 

尽管popitem和列表的pop方法很类似,但字典中没有与append等价的方法。因为字典是无序

的,类似于append的方法是没有任何意义的。

 

 

  1. setdefault

setdefault方法在某种程度上类似于get方法,就是能够获得与给定键相关联的值,除此之外,setdefault还能在字典中不含有给定键的情况下设定相应的键值。(即当改键的值存在时就返回改值,不存在时就设置默认的值,第二个参数表示默认值)

d = {}
d.setdefault('name','ss')
print d
dd=  d['name'] = 'Gumby'
print dd
print d.setdefault('name','ss')
print d

 

输出:

{'name': 'ss'}

Gumby

Gumby

{'name': 'Gumby'}

 

 

11 .update

update方法可以利用一个字典项更新另外一个字典:

d={}

x={}

d.update(x)

x字典中的项会被添加到d字典中,若有相同的键则会进行覆盖

 

update方法可以使用与调用dict函数(或者类型构造函数)同样的方式进行调用,这点在本

章前面已经讨论。这就意味着update可以和映射、拥有(键,值)对的队列(或者其他可迭代的

对象)以及哭键字参数一起调用。

 

 

  1. val ues和itervalues

values方法以列表的形式返回字典中的值(itervalues返回值的迭代器)。与返回键的列表不

同的是,返回值的列表中可以包含重复的元素:

>>>d={}

>>>d[1] = 1

>>>d[2]=2

>>>d[3]=3

>>>d[4]=1

>>>d.values()

[1. 2. 3. 1]

 

 

本章介绍了如下内容:

映射:映射可以使用任何不可变对象标识元素。最常用的类型是字符串和元组。Python唯一

内建的映射类型是字典。

利用字典格式化字符串:可以通过在格式化说明符中包括名称(键)来对字典应用字符串格

式化操作。当在字符格式化中使用元组时,还需要对元组中每一个元素都设定“格式化说明符”。

在使用字典时,所用的说明符可以比在字典中用到的项少。

字典的方法:字典有很多方法,调用的方式和调用列表以及字符串方法的方式相同。

 

4.3.1本章的新函数

本章涉及的新函数如表4-1所示。

表4-1本章的新函数

函数描述

dict(seq)  用(键,值)对(或者映射和关键字参数)建立字典

 

 

 

 

 

 

 

avatar

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: