Python里唯一的映射类型是字典。
映射类型对象里,hash值(key)和指向的对象(值)是一对多的关系。
字典对象是可变的,这一点上很像列表,它也可以存储任意个数任意类型的Python对象,其中包括容器类型。字典类型和序列类型的区别是存储和访问数据的方式不同。序列类型只用数字类型的键(从序列开始按数值顺序索引。)映射类型的键(key)可以是其他的对象类型(一般是字符串),映射类型的键直接或间接地和存储的数据值相关联。而在映射类型中,数据是无序排列的。

一个字典条目的语法格式是 键:值。 多条字典条目被包含在{}里。
创建字典和赋值

>>> dict1 = {}
>>> dict2 = {1:80, 'string':'sss', 2.3:['list']}
>>> dict1,dict2
({}, {1: 80, 'string': 'sss', 2.3: ['list']})
>>> dict3 = dict((['x',1],['y',2]))
>>> dict3
{'y': 2, 'x': 1}

访问字典中的值
遍历一个字典,只需要循环查看它的键

>>> for key in dict2.keys():
print 'key = %s, value = %s' % (key, dict2[key]) key = 1, value = 80
key = string, value = sss
key = 2.3, value = ['list']

也可以不用keys()方法,用迭代器来访问:

>>> for i in dict2:
print 'key = %s, value = %s' % (i, dict2[i]) key = 1, value = 80
key = string, value = sss
key = 2.3, value = ['list']

要得到字典里的某个元素的值,使用字典[键]的方式:

>>> dict2 = {1:80, 'string':'sss', 2.3:['list']}
>>> dict2['string']
'sss'
>>> dict2[string] Traceback (most recent call last):
File "<pyshell#2>", line 1, in <module>
dict2[string]
NameError: name 'string' is not defined

如果没有对应的键,就会报错。
判断一个字典中是否有某个键可以用in 以及 not in操作符

>>> 1 in dict2
True
>>> 'sss' in dict2
False

字典中的键不允许改变,所以我们用数字和字符串作为键,列表和其他字典不允许作为键。

映射类型操作符
字典可以和所有标注类型操作符一起工作但不支持拼接和重复一类的操作。
字典的键查找操作符[]是唯一仅用于字典的操作符,它和切片操作符很相像,但是[]里不只是数字索引。

字典的比较cmp(dict1, dict2)
先比较字典的长度(键的数量),再比较字典的键,再比较字典的值,然后是完全匹配。

映射类型相关函数
dict()
如果不提供参数,会生成空字典。当容器类型对象作为一个参数传递给dict()时,如果参数是可迭代的,那么这个序列必须是成对出现的。每个值的对中,第一个元素是键,第二个元素是值。如果输入参数是(另)一个映射对象,对其调用dict()会从存在的字典里复制内容来生成新的字典。新生成的字典是原来字典的浅复制,它与用copy()方法生成的字典对象一样,但是比用copy()方法慢。

>>> dict(zip(('x', 'y'), (1, 2)))
{'y': 2, 'x': 1}
>>> dict([['x', 1], ['y', 2]])
{'y': 2, 'x': 1}
>>> dict([('xy'[i-1], i) for i in range(1,3)])
{'y': 2, 'x': 1}
>>> dict(x=1, y=2)
{'y': 2, 'x': 1}
>>> dict8 = dict(x=1, y=2)
>>> dict8
{'y': 2, 'x': 1}
>>> dict9 = dict(**dict8)
>>> dict9
{'y': 2, 'x': 1}
>>> dict9 = dict8.copy()
>>> dict9
{'y': 2, 'x': 1}

hash()
hash()本身不是为字典设计的方法,但它可以判断一个对象是否可以做字典的键。只有这个对象是可哈希的,才可以作为字典的键(函数的返回值是整数,不产生错误和异常)
如果用比较操作符比较两个数值,发现它们相等,那么即使两者数据类型不同,也会得到相同的哈希值。
如果是非可哈希对象作为参数,会产生TypeError错误。

函数 操作
dict([container]) 创建字典的工厂函数。如果提供了容器类(container) , 就
用其中的条目填充字典,否则就创建一个空字典。
len(mapping) 返回映射的长度(键-值对的个数)

映射类型的内建方法

方法名字 操作
dict.clear() 删除字典中所有元素
dict.copy() 返回字典(浅复制)的一个副本
dict.fromkeysc(seq,val=None)  创建并返回一个新字典,以seq 中的元素做该字典的键,val 做该字典中所有键对应的初始值(如果不提供此值,则默认为None)
dict.get(key,default=None)  对字典dict 中的键key,返回它对应的值value,如果字典中不存在此键,则返回default 的值(注意,参数default 的默认值为None)
dict.has_key(key) 如果键(key)在字典中存在,返回True,否则返回False. 在Python2.2版本引入in 和not in 后,此方法几乎已废弃不用了,但仍提供一个可工作的接口。
dict.items()  返回一个包含字典中(键, 值)对元组的列表
dict.keys() 返回一个包含字典中键的列表
dict.iter() 方法iteritems(), iterkeys(), itervalues()与它们对应的非迭代方法一样,不同的是它们返回一个迭代子,而不是一个列表。
dict.popc(key[, default]) 和方法get()相似,如果字典中key 键存在,删除并返回dict[key],如果key 键不存在,且没有给出default 的值,引发KeyError 异常。
dict.setdefault(key,default=None) 和方法set()相似,如果字典中不存在key 键,由dict[key]=default 为它赋值。
dict.update(dict2) 将字典dict2 的键-值对添加到字典dict
dict.values() 返回一个包含字典中所有值的列表

字典的键
字典中的值没有任何限制,可以是任意Python对象,但是字典中的键是有类型限制的。
1、不允许一个键对应多个对象,当有键冲突时,取最后的赋值。

>>> dict1 = {'a':123,'a':'abc'}
>>> dict1
{'a': 'abc'}

2、键必须是可哈希的,像字典和列表这样的可变类型是不可哈希的,不能作为键。所有的不可变类型都是可哈希的,可以作为键。但是数值相等的数字哈希值相同,所以是相同的键。元组是不可变类型,但是它不是一成不变的,用元组做有效的键,元组中必须只包括像数字和字符串这样的不可变参数,才可以作为字典中有效的键。

>>> dict2 = {1:'abc', 1.0:''}
>>> dict2
{1: ''}
>>> dict3 = {(1,2,3):''}
>>> dict3
{(1, 2, 3): ''}
>>> dict4 = {([1,2,3],2):''} Traceback (most recent call last):
File "<pyshell#6>", line 1, in <module>
dict4 = {([1,2,3],2):''}
TypeError: unhashable type: 'list'

集合类型

数学上,把 set 称做由不同的元素组成的集合,集合(set)的成员通常被称做集合元素(set elements)。Python把这个概念引入到它的集合类型对象里。集合对象是一组无序排列的可哈希的值,所以可以做字典中的键。
和其他容器类型一样,集合可以用in和 not in操作符检查成员,由len()内建函数得到集合的基数(大小),用for循环迭代集合成员。但是因为集合本身无序,不可以为集合创建索引或执行切片操作,也没有键来获取集合中元素的值。
集合(sets)有两种类型,可变集合(set)和不可变集合(frozenset)。其中可变集合可以添加删除元素,但它是不可哈希的。不可变集合不可更改元素,但它可哈希。
Python的集合操作符是这样的

Python符号 说明
in  是...的成员
not in 不是...的成员
== 等于
!= 不等于
< 是...的(严格)子集
<= 是...的(非严格)子集
> 是...的(严格)超集
>= 是...的(非严格)超集
& 交集
| 并集
- 差补或相对补集
^ 对称差分

创建集合类型和给集合类型赋值
集合与列表([])和字典({})不同,没有特别的语法格式。列表和字典可以分别用他们自己的工厂方法list()和dict()创建,这是集合被创建的唯一方法——用集合的工厂方法 set() 和 frosenset():

>>> s = set('hellopython')
>>> s
set(['e', 'h', 'l', 'o', 'n', 'p', 't', 'y'])
>>> t = frozenset(['a','b','c','d','e'])
>>> t
frozenset(['a', 'c', 'b', 'e', 'd'])
>>> type(t)
<type 'frozenset'>
>>> type(s)
<type 'set'>
>>> len(s)
8

访问集合中的值

>>> 'e' in s
True
>>> 'a' in s
False
>>> for i in s:
print i e
h
l
o
n
p
t
y

更新集合
如下操作:

>>> s.add('z')
>>> s
set(['e', 'h', 'l', 'o', 'n', 'p', 't', 'y', 'z'])
>>> s.update('abc')
>>> s
set(['a', 'c', 'b', 'e', 'h', 'l', 'o', 'n', 'p', 't', 'y', 'z'])
>>> s.remove('z')
>>> s
set(['a', 'c', 'b', 'e', 'h', 'l', 'o', 'n', 'p', 't', 'y'])
>>> s -= set('python')
>>> s
set(['a', 'c', 'b', 'e', 'l'])

集合类型操作符
如上表表示。
此处只写出一些运算符的使用方法:

>>> a = set('abcd')
>>> b = frozenset('cdef')
>>> a | b #并
set(['a', 'c', 'b', 'e', 'd', 'f'])
>>> a & b #交
set(['c', 'd'])
>>> a - b #差
set(['a', 'b'])
>>> a ^ b #对称差分
set(['a', 'b', 'e', 'f'])
>>> b | a
frozenset(['a', 'c', 'b', 'e', 'd', 'f'])
>>> b ^ a
frozenset(['a', 'b', 'e', 'f'])

如果两个集合是不同类型的结合,那么结果类型和左操作数的类型相同

集合类型操作符(仅用于可变集合)
(Union) Update ( |= )
这个方法可以添加多个成员,和上面额update()等价

>>> a = set('abcd')
>>> a |= set('happy')
>>> a
set(['a', 'c', 'b', 'd', 'h', 'p', 'y'])

保留/交集更新( &= )

>>> a = set('abdef')
>>> a &= set('abcd')
>>> a
set(['a', 'b', 'd'])

差更新(-=)和对称差分更新)(^=)不赘述

集合类型内建方法

可用于全部集合的方法 操作
s.issubset(t) 如果s 是t 的子集,则返回True,否则返回False
s.issuperset(t) 如果t 是s 的超集,则返回True,否则返回False
s.union(t) 返回一个新集合,该集合是s 和t 的并集
s.intersection(t) 返回一个新集合,该集合是s 和t 的交集
s.difference(t)  返回一个新集合,该集合是s 的成员,但不是t 的成员
s.symmetric_difference(t) 返回一个新集合,该集合是s 或t 的成员,但不是s 和t 共有的成员
s.copy() 返回一个新集合,它是集合s 的浅复制
可变集合类型的方法 操作
s.update(t) 用t 中的元素修改s, 即,s 现在包含s 或t 的成员
s.intersection_update(t)  s 中的成员是共同属于s 和t 的元素
s.difference_update(t)  s 中的成员是属于s 但不包含在t 中的元素
s.symmetric_difference_update(t)  s中的成员更新为那些包含在s 或t 中,但不 是s和t 共有的元素
s.add(obj) 在集合s 中添加对象obj
s.remove(obj)  从集合s 中删除对象obj;如果obj 不是集合s 中的元素(obj not in s),将引发KeyError 错误
s.discard(obj)  如果obj 是集合s 中的元素,从集合s 中删除对象obj
s.pop() 删除集合s 中的任意一个对象,并返回它
s.clear()  删除集合s 中的所有元素

2015/9/4 Python基础(8):映射和集合类型的更多相关文章

  1. python基础:映射和集合类型

    python字典的迭代器遍历 字典有一个方法可以返回该字典的迭代器,这个方法就是: dict. iteritems() 当在字典中增加或者删除字典entry的时候,迭代器会失效的,类似于C++的stl ...

  2. 第二百九十八节,python操作redis缓存-Set集合类型,可以理解为不能有重复元素的列表

    python操作redis缓存-Set集合类型,可以理解为不能有重复元素的列表 sadd(name,values)name对应的集合中添加元素 #!/usr/bin/env python # -*- ...

  3. 2015/8/31 Python基础(5):字符串

    字符串是Python最常见的一种类型.通过在引号间包含字符的方式创建它.Python里单双引号的作用是一致的.Python的对象类型里不存在字符型,一般用单个字符的字符串来使用.Python的字符串是 ...

  4. 《Python核心编程》 第七章 映射和集合类型 - 习题

    课后习题 7–1. 字典方法.哪个字典方法可以用来把两个字典合并到一起? 答: dict1 = {' :' python' } dict2 = {' :"hello" } dict ...

  5. python基础之字典、集合

    一.字典(dictionary) 作用:存多个值,key-value存取,取值速度快 定义:key必须是不可变类型,value可以是任意类型 字典是一个无序的,可以修改的,元素呈键值对的形式,以逗号分 ...

  6. Python核心编程读笔 6: 映射和集合类型

    第七章 映射和集合能力 一 字典(python中唯一的映射类型) 1 基本 创建和赋值: 正常创建:>>>dict = {'name':'earth', 'port':80} 用工厂 ...

  7. python基础一数据类型之集合

    摘要: python基础一中介绍数据类型的时候有集合,所以这篇主要讲集合. 1,集合的定义 2,集合的功能 3,集合的方法 1,集合的定义 list1 = [1,4,5,7,3,6,7,9] set1 ...

  8. Python基础一数据类型之数字类型

    摘要: python基础一中提到了数据类型,这里主要讲解的是数字类型. 数字类型: 1,整型 2,长整型 3,浮点型 4,复数型 1,整型(int) 定义a = 1 通过type函数查看数据类型,整型 ...

  9. python基础(1) 变量类型

    变量赋值: python中的变量不需要类型声明 每个变量在使用前必须赋值,变量赋值以后才会被创建 变量在内存中创建时,包括变量的标识.名称和数据这些信息. EX: #!/usr/bin/python ...

随机推荐

  1. Thunder团队第二周 - Scrum会议2

    Scrum会议2 小组名称:Thunder 项目名称:爱阅app Scrum Master:胡佑蓉 工作照片: 参会成员: 王航:http://www.cnblogs.com/wangh013/ 李传 ...

  2. 团队选题报告(i know)

    一.团队成员及分工 团队名称:I know 团队成员: 陈家权:选题报告word撰写 赖晓连:ppt制作,原型设计 雷晶:ppt制作,原型设计 林巧娜:原型设计,博客随笔撰写 庄加鑫:选题报告word ...

  3. Launch Image消失时添加动画

    CGSize viewSize = self.window.bounds.size; NSString *viewOrientation = @"Portrait"; //横屏请设 ...

  4. node中的__dirname

    先说结论:__dirname指的是当前文件所在文件夹的绝对路径. 测试路径如下: 即 根目录/dir0.js 根目录/path1/dir1.js 根目录/paht1/path2/dir2.js 每个d ...

  5. 大全Kafka Streams

    本文将从以下三个方面全面介绍Kafka Streams 一. Kafka Streams 概念 二. Kafka Streams 使用 三. Kafka Streams WordCount   一. ...

  6. Perfmon - 脚本自动监控

    PerfMon-Windows性能监视器是个好东西,可以辅助我们分析发生问题时间段服务器资源占用情况,但是部署性能计数器确实一个相当麻烦的事情,往往这种枯燥的事别人还做不了,只能由我们这些希望获取到P ...

  7. 添加路由时啥时候是dev啥时候是gw

    A qumu ethA1 B 宿主机 ethA2  ethC2 C 树莓派 ethC1 在A和C中都是直接sudo route add default dev ethA1/ethC1 这样做是有问题的 ...

  8. 细说匿名内部类引用方法局部变量时为什么需要声明为final

    一.前言 在研究公司某个项目的源码,看到前人使用了挺多内部类,内部类平时我用的比较多的是匿名内部类,平时用的多的是匿名内部类,其他形式的用的比较少,然后我就有个疑惑:到底内部类是基于什么样的考虑,才让 ...

  9. 【转】log4j.properties文件的配置

    一.前言 log4j使用的还是比较多的,但是对于其配置又很难描述清楚要怎么配置,说明我自己对于log4j的配置并不是非常熟悉,所以在网上找了一篇详尽的 博文转载,在此非常感谢原文作者的辛苦付出,如有需 ...

  10. AndroidStudio3.0 注解报错Annotation processors must be explicitly declared now. The following dependencies on the compile classpath are found to contain annotation processor.

    把Androidstudio2.2的项目放到3.0里面去了,然后开始报错了. 体验最新版AndroidStudio3.0 Canary 8的时候,发现之前项目的butter knife报错,用到注解的 ...