python学习05-映射和集合类型

字典是 Python 语言中唯一的映射类型。映射类型对象里哈希值(键) 和指向的对象(值)是一对多的关系。一个字典对象是可变的,它是一个容器类型,能存储任意个数的 Python 对象,其中也包括其他容器类型。字典类型和序列类型容器类(列表、元组)的区别是存储和访问数据的方式不同。序列类型只用数字类型的键(从序列的开始起按数值顺序索引)。映射类型可以用其他对象类型做键;一般最常见的是用字符串做键(keys)。映射类型中的数据是无序排列的。
创建字典只需要把字典赋值给一个变量,不管这个字典是否包含元素,可以用工厂方法 dict() 来创建字典。可以用一个很方便的内建方法 fromkeys() 来创建一个”默认”字典, 字典中元素具有相同的值 (如果没有给出, 默认为 None)。
避免使用内建对象名字作为变量的标识符。请不要用 dict, list,file, bool, str, input, len 这样的内建类型为变量命名。
字典的键查找操作符([ ])
d[k] = v 通过键’k’,给字典中某元素赋值’v’
d[k] 通过键’k’,查询字典中某元素的值
(键)成员关系操作( in ,not in)
cmp() 字典是通过这样的算法来比较的: 首先是字典的大小,然后是键,最后是值。
映射类型相关的函数
dict() 当容器类型对象做为一个参数传递给方法 dict() 时很有意思。如果参数是可以迭代的,那每个可迭代的元素必须成对出现。在每个值对中,第一个元素是字典的键、第二个元素是字典中的值。
如果输入参数是(另)一个映射对象,比如,一个字典对象,对其调用 dict()会从存在的字典里复制内容来生成新的字典。新生成的字典是原来字典对象的浅复制版本, 它与用字典的内建方法copy() 生成的字典对象是一样的。但是从已存在的字典生成新的字典速度比用 copy()方法慢,我们推荐使用 copy()。
hash() 它可以判断某个对象是否可以做一个字典的键。如果非可哈希类型作为参数传递给 hash()方法,会产生 TypeError 错误。
keys()方法,返回一个列表,包含字典中所有的键,values()方法,返回一个列表,包含字典中所有的值,items(), 返回一个包含所有(键, 值)元组的列表。
dict.clear() 清除字典中的所有元素
dict.copy() 返回字典的一个浅拷贝
dick.fromkeys(seq, val=None) 创建并返回一个新字典,以 seq 中的元素做该字典的键,val 做该字典中所有键对应的初始值(如果不提供此值,则默认为 None)
dict.get(key,default=None) 对字典 dict 中的键 key,返回它对应的值 value,如果字典中不存在此键,则返回 default 的值(注意,参数 default 的默认值为 None)
dict.items() 返回一个包含字典中(键, 值)对元组的列表
dict.keys() 返回一个包含字典中键的列表
dict.iter() 方法 iteritems(), iterkeys(), itervalues()与它们对应的非迭代方法一样,不同的是它们返回一个迭代子,而不是一个列表。
dict.pop(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() 返回一个包含字典中所有值的列表

集合类型
集合对象是一组无序排列的可哈希的值。是的,集合成员可以做字典中的键。
因为集合本身是无序的,你不可以为集合创建索引或执行切片(slice)操作,也没有键(keys)可用来获取集合中元素的值。
集合(sets)有两种不同的类型,可变集合(set) 和 不可变集合(frozenset)。如你所想,对可变集合(set),你可以添加和删除元素,对 不可变集合(frozenset)则不允许这样做。请注意,可变集合(set)不是可哈希的,因此既不能用做字典的键也不能做其他集合中的元素。不可变集合(frozenset)则正好相反,即,他们有哈希值,能被用做字典的键或是作为集合中的一个成员。
集合被创建的唯一方法 - 用集合的工厂方法 set()和 frozenset()
你可以遍历查看集合成员或检查某项元素是否是一个集合中的成员
就序列而言,Python 中的 in 和 not in 操作符决定某个元素是否是一个集合中的成员。
等价/不等价被用于在相同或不同的集合之间做比较。两个集合相等是指,对每个集合而言,当且仅当其中一个集合中的每个成员同时也是另一个集合中的成员。
Sets 用 Python 的比较操作符检查某集合是否是其他集合的超集或子集。“小于”符号( <, <= )用来判断子集,“大于”符号( >, >= )用来判断超集。
联合( | )
联合(union)操作和集合的 OR(又称可兼析取(inclusive disjunction))其实是等价的,两个集合的联合是一个新集合,该集合中的每个元素都至少是其中一个集合的成员,即,属于两个集合其中之一的成员。联合符号有一个等价的方法,union().
交集( & )
你可以把交集操作比做集合的 AND(或合取)操作。两个集合的交集是一个新集合,该集合中的每个元素同时是两个集合中的成员,即,属于两个集合的成员。交集符号有一个等价的方法,intersection().
差补/相对补集( – )
两个集合(s 和 t)的差补或相对补集是指一个集合 C,该集合中的元素,只属于集合 s,而不属于集合 t。差符号有一个等价的方法,difference().
对称差分( ^ )
和其他的布尔集合操作相似,对称差分是集合的 XOR(又称”异或“ (exclusive disjunction)).两个集合(s 和 t)的对称差分是指另外一个集合 C,该集合中的元素,只能是属于集合 s 或者集合 t的成员,不能同时属于两个集合。对称差分有一个等价的方法,symmetric_difference().

s ^ t

set([‘k’, ‘b’, ‘e’, ‘c’])

如果左右两个操作数的类型相同,既都是可变集合或不可变集合, 则所产生的结果类型是相同的,但如果左右两个操作数的类型不相同(左操作数是 set,右操作数是 frozenset,或相反情况),则所产生的结果类型与左操作数的类型相同。
集合类型操作符(仅适用于可变集合)
(Union) Update ( |= ) 这个更新方法从已存在的集合中添加(可能多个)成员,此方法和 update()等价
保留/交集更新( &= ) 保留(或交集更新)操作保留与其他集合的共有成员。此方法和 intersection_update()等价.
差更新 ( –= ) 对集合 s 和 t 进行差更新操作 s-=t,差更新操作会返回一个集合,该集合中的成员是集合 s 去除掉集合 t 中元素后剩余的元素。此方法和 difference_update()等价.
对称差分更新( ^= ) 对集合 s 和 t 进行对称差分更新操作(s^=t),对称差分更新操作会返回一个集合,该集合中的成员仅是原集合 s 或仅是另一集合 t 中的成员。此方法和 symmetric_difference_update()等价.
集合类型方法
s.issubset(t) 如果 s 是 t 的子集,则返回 True,否则返回 False
s.isuperset(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 notin s),将引发 KeyError 错误
s.discard(obj) 如果 obj 是集合 s 中的元素,从集合 s 中删除对象 obj;
s.pop() 删除集合 s 中的任意一个对象,并返回它
s.clear() 删除集合 s 中的所有元素

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值