python中唯一的映射_Python唯一的内建映射类型之字典

字典:如果想将值分组到一个结构中,并且通过编号对其进行引用,列表就能派上用场了。字典是一种通过名字引用值的数据结构,字典中的值并没有特殊的顺序,但是都是存储在一个特定的键(Key)里,键可以是数字、字符串或者元组。

创建和使用字典:

字典是由多个键及与其对应的值构成的对组成(键/值对称为项),每个键和它的值之间用冒号(:)隔开,项之间用逗号(,)隔开,而整个字典是由一对大括号括起来,空字典(不包括任何项)由两个大括号组成,字典中的键是唯一的,而值并不唯一

>>> phonebook={'Alice':'2341','Beth':'9102','Cecil':'3258'} #定义字典也可以通过dict函数来建立字典

>>> items=[('name','Gumby'),('age',42)]

>>> d=dict(items) #通过dict函数来建立映射关系

>>> d

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

>>> dd=dict(name='Clef',age=42) #通用是通过dict函数来建立映射关系的另一种表达

>>> dd

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

基本的字典操作:

字典的基本行为在很多方面与序列(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为字典)查找的是键,而不是值,表达式v in l(l为列表)则用来查找值,不是索引

>>> x=[] #x为空的列表

>>> x[2]='Testing' #试图给空列表的'2'号位置赋值,这显然是不可以的,因为这个位置根本就不存在

Traceback (most recent call last):

File "", line 1, in

IndexError: list assignment index out of range

>>> x={} #x为空的字典

>>> x[2]='Testing' #把'Testing'关联到空字典的键'2'号上,是没有问题的

>>> x

{2: 'Testing'}

字典的格式化字符串:

使用字符串作为键的字典,在每个转换说明符(conversion specifier)中的%字符后面,可以加上(用圆括号括起来的)键,后面再跟上其他说明元素,友情链接:字符串格式化

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

>>> "Cecil's phone number is %(Cecil)s." % phonebook

"Cecil's phone number is 3258."

字典方法:

1. clear方法

清除字典中所有的项,这是个原地操作(类似于list.sort),所以无返回值(或者说返回None)

>>> x={}

>>> y=x #x,y对应同一个字典

>>> x['Key']='value'

>>> y

{'Key': 'value'}

>>> x={} #重新对字典x赋值为空,但是x清空了,但是y字典没有清空

>>> x

{}

>>> y

{'Key': 'value'}

>>> x={}

>>> y=x

>>> x['Key']='value'

>>> x.clear() #但是用clear方法就可以达到两者都清空的目的

>>> x

{}

>>> y

{}

2. copy方法

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

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

>>> y=x.copy() #浅复制

>>> y['username']='mlh' #修改字典的某个值

>>> y['machine'].remove('bar') #删除字典的某个值

>>> x

{'username': 'admin', 'machine': ['foo', 'baz']} #修改的值对原字典没有影响,删除的值对原字典有影响

>>> y

{'username': 'mlh', 'machine': ['foo', 'baz']}避免上面浅复制带来的影响,可以用深复制(deep copy)

>>> from copy import deepcopy #导入deepcopy函数

>>> d={}

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

>>> c=d.copy() #浅复制

>>> dc=deepcopy(d) #深复制

>>> d['names'].append('Clice') #修改原字典的内容

>>> c

{'names': ['Alfred', 'Bertrand', 'Clice']} #浅复制的新字典也随着修改了

>>> dc

{'names': ['Alfred', 'Bertrand']} #深复制的新字典没有改变

3. fromkeys方法

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

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

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

>>> dict.fromkeys(['name','age']) #也可以用dict函数

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

>>> dict.fromkeys(['name','age'],'(unknown)') #不用默认的None,自己通过默认值

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

4. get方法

访问字典项的方法

>>> d={}

>>> print d['name'] #打印字典里面没有的键会报错

Traceback (most recent call last):

File "", line 1, in

KeyError: 'name'

>>> print d.get('name') #用get方法就不会,打印None

None

>>> d.get('name','N/A') #取代默认的None,用N/A来替代

'N/A'

5. has_key方法

检查字典中是否含有给出的键,表达式d.has_key(k)相当于表达式k in d,注意Python 3.0中不包含这个函数

>>> d={}

>>> d.has_key('name')

False

>>> d['name']='Eric'

>>> d.has_key('name')

True

6. items方法和iteritems方法

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

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

>>> phonebook.items()

[('Beth', '9102'), ('Alice', '2341'), ('Cecil', '3258')]

>>> phonebook.iteritems() #iteritems方法作用大致和items相同,但是会返回一个迭代器对象而不是列表

>>> list(phonebook.iteritems())

[('Beth', '9102'), ('Alice', '2341'), ('Cecil', '3258')]

7. keys方法和iterkeys方法

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

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

>>> phonebook.keys()

['Beth', 'Alice', 'Cecil']

8. pop方法

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

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

>>> phonebook.pop('Alice') #移除键'Alice'以及对应的值

'2341'

>>> phonebook

{'Beth': '9102', 'Cecil': '3258'}

9. popitem方法

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

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

>>> phonebook.popitem() #随机弹出一项

('Beth', '9102')

>>> phonebook

{'Alice': '2341', 'Cecil': '3258'}

10. setdefault方法

在某种程度上类似于get方法,就是能够获得于给定键相关联的值,除此之外,setdefault还能在字典中不含有给定键的情况下设定相应的键值

>>> d={}

>>> d.setdefault('name','N/A') #如果不设定值,默认是None

'N/A'

>>> d

{'name': 'N/A'}

>>> d['name']='Gumby'

>>> d.setdefault('name','N/A') #当键为'name'的值不会空时,就不能设置了,返回对应的值

'Gumby'

>>> d

{'name': 'Gumby'}

11. update方法

利用一个字典项更新另外一个字典,如果没有相同的键,会添加到旧的字典里面

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

>>> x={'Alice':'changed'}

>>> phonebook.update(x) #更新键'Alice'对应的值

>>> phonebook

{'Beth': '9102', 'Alice': 'changed', 'Cecil': '3258'}

>>> x={'Alicex':'changed'} #没有相同的键,直接添加到旧的字典里面

>>> phonebook.update(x)

>>> phonebook

{'Beth': '9102', 'Alice': 'changed', 'Alicex': 'changed', 'Cecil': '3258'}

12. values方法和itervalues方法

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

>>> d={}

>>> d[1]=1

>>> d[2]=2

>>> d[3]=3

>>> d[4]=1

>>> d.values()

[1, 2, 3, 1]

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值