Python学习笔记7:Python字典和集合

1、字典–映射类型
映射类型通常被称作哈希表。哈希表有较好的性能。
映射类型对象里哈希值(键,key)和指向的对象(值,value)是一对多的关系。
Python的字典是作为可变的哈希表实现的。字典类似于Perl中的“关联数组”或散列。
一个字典对象是可变的,它是一个容器类型,能存储任意个数的Python对象,其中也包括其他容器类型。
字典类型和序列类型容器类(列表、元组)的区别是存储和访问数据的方式不同。序列类型只用数字类型的键,字典可以用其他类型做键。
字典是一个无序的数据类型。
字典条目包含在{}中。
创建字典 dict1={}
使用工厂方法dict()来创建字典d=dict(([‘x’,1],[‘y’,2]))(2.2)
要得到字典中某个元素的值,可以用字典键加上中括号来得到。在字典中找不到某个数据元素时,会得到KeyError异常。
使用内建方法fromkeys()(2.3)创建默认字典,字典元素具有相同的值,若没有给出,默认为None。d={}.fromkeys((‘x’,’y’),-1)(2.3)
遍历字典

for key in dict1.keys():
    (key,dict1[key])

使用迭代器来轻松地访问类序列对象(sequence like objects)(2.2)

for key in dict2:
     (key,dict2[key])

检查字典中是否有某个键可以使用has_key()方法(未来弃用)以后使用in或not in操作符(2.2)
字典可以采用各种类型的数据作为字典的键。
字典的键不可变,所以字典不可作为字典的键。字典的键必须是可哈希的。
给字典添加新项(新元素);修改字典已存在项;或删除已存在项。
dict1[‘name’]=’venus’ #更新或增加新条目
可以使用内建方法update()将整个字典的内容添加到另一个字典。

>>>print 'host %(name)s is running on port %(port)d' %dict   #另一种在字典中使用字符串格式符(%)的方法

用del语句删除字典 del dict1
用del语句删除字典元素 del dict1[‘name’]
删除字典所有条目 dict1.clear()
删除并返回字典条目 dict1.pop(‘name’)

2、映射类型操作符
(1)标准类型操作符
除拼接(concatenation)和重复(repetition)操作外,字典可以和所有的标准类型操作符一起工作。
(2)映射类型操作符
字典键查找操作符([])
(键)成员关系操作(in,not in)

3、映射类型的内建函数和工厂方法
(1)标准类型函数
type()
str()
cmp()比较字典的方法:首先是字典的大小,然后是键,最后是值。
(2)映射类型相关的函数
dict()工厂函数
当容器对象作为dict()的参数时,若参数是可迭代的,即一个序列,或迭代器或一个支持迭代的操作,那每个可迭代元素必须成对出现。若参数是另一个字典,新生成的字典是原字典对象的浅复制版本。而从已存在字典生成新字典推荐使用copy()方法,速度比dict()快。2.3开始,dict()方法可接受字典或关键字参数字典。

>>>d=dict(x=1,y=2)
>>>dict9=dict(**d)

使用下面的代码更聪明(效率更好):

>>>dict9=d.copy()

len() 返回元素数目
hash() 可判断某个对象是否可以做一个字典的键。会返回传入对象的哈希值。只有对象是可哈希的,才可以作为字典的键。若参数是不可哈希的,会产生TypeError错误。
若两个数值相等,即使两者数据类型不同,也会得到相同哈希值。

4、映射类型内建方法

  • dict.clear()(1.5) 删除字典中所有元素 dict.copy()(1.5) 返回字典(浅复制)副本
  • dict.fromkeys(seq,val=None)(2.3)创建以seq中元素作为字典键,val作字典中所有键对应的初始值的新字典。
  • dict.get(key,default=None)(1.5)返回key对应的值value,若不存在key,返回default的值
  • dict.pop(key[,default])(2.3)和get()方法相似,若字典中存在key,删除并返回dict[key];如果不存在key且没有给出default值,则引发KeyError异常
  • dict.has_key(key)在字典中查看key是否存在(未来弃用)
  • dict.items()/dict.keys()/dict.values() dict.iter*() (2.2)返回迭代子,而不是列表
  • dict.iteritems()/dict.iterkeys()/dict.itervalues()均返回迭代子
  • dict.update(dict2)(1.5)将字典dict2的键-值对添加到字典dict
  • dict.setdefault(key,default=None)(2.0)和set()方法类似 for key in
  • sorted(dict2):#sorted()方法是为迭代子准备的内建函数,返回有序的迭代子

5、字典的键
每个键只能对应一个项。当有键发生冲突,取最后的赋值。
键必须是可哈希的。列表和字典等可变类型,它们不是可哈希的,所以不能作为字典的键。
所有不可变对象都是可哈希的,因此它们都可以作为字典的键。值相等的数字表示相同的键(如1和1.0的哈希值相同,是相同的键)。
也有很少的可变对象可以做字典的键,如:实现__hash()__特殊方法的类,若__hash()__方法返回一个整型,该对象仍然可以做字典的键,尽管是可变对象。
元组做有效的键,必须使用限制:元组中只包括像数字和字符串这样的不可变参数才可。

6、集合类型(2.4)
集合(set)、集合元素(set element)
集合对象是一组无序排列的可哈希的值。
集合成员可以做字典的键。
集合本身是无序的,不可以为集合创建索引或执行切片操作,也没有键可用来获取集合中元素的值。
集合分为可变集合(set)和不可变集合(frozenset)
修改不可变集合会引发异常。
可变集合不能用作字典的键也不能做其他集合中的元素。
集合创建的唯一方法:用工厂方法set()/frozenset()
遍历访问集合元素: for i in s:
集合使用in和not in操作符检查成员是否存在。
更新可变集合:
s.add(‘z’)
s.update(‘pypi’)
s.remove(‘z’)
s-=set(‘pypi’)
使用del语句删除集合 del s

7、集合类型操作符
(1)标准类型操作符(所有的集合类型)
in/not in(成员关系)
==/!=(集合等价/不等价)
< <=/> >=(子集/超集)
(2)集合类型操作符(所有的集合类型)

  • 联合(|)等价于集合的OR=>等价方法union()
  • 交集(&)等价于集合的AND=>等价方法intersection()
  • 差补/相对补集(-)=>等价方法difference()
  • 对称差分(^)等价于集合的XOR(异或)=>等价方法symmetric_difference()

混合集合类型操作

  • 若左右操作数同时是可变集合或不可变集合,结果类型相同。
  • 若左右操作数类型不相同,则结果类型与左操作数类型相同。

(3)集合类型操作符(仅适用于可变集合)

  • (Union)Update(|=)=>与update()等价
  • Refention/IntersectionUpdate(&=)=>与intersection_update()等价
  • Difference Update(-=)=>与difference_update()等价
  • Symmetric Difference Update(^=)=>与symmetric_difference_update()等价

8、内建函数
(1)标准类型函数
len()
(2)集合类型工厂函数
set()/frozenset()参数必须是可迭代的,即一个序列,或迭代器,或支持迭代的对象。

9、集合类型内建方法
很多内建方法都有等价的操作符。
(1)适用于所有集合的方法

  • s.issubset(t) s是t的子集返回True
  • s.issuperset(t) s是t的超集返回True
  • s.union(t)并集
  • s.intersection(t)交集
  • s.difference(t)差集
  • s.symmetric_difference(t)异或
  • s.copy()浅复制

(2)仅适用于可变集合的方法

  • 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)在集合中添加对象obj
  • s.remove(obj)从集合s中删除对象obj,若obj不在集合中将引发KeyError错误
  • s.discard(obj)从集合s中删除对象obj s.pop()删除集合s中任意一个对象并返回它
  • s.clear()删除集合所有元素

(3)操作符和内建方法比较
两者之间有一个重要的区别:当用操作符时,操作符两边的操作数必须是集合。在使用内建方法时,对象也可以是迭代类型的。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值