Task06:字典与集合(1day)
1.字典
字典是以 关键字 为索引的,关键字可以是任意不可变类型,通常是字符串或数字。如果一个元组只包含字符串、数字或元组,那么这个元组也可以用作关键字。但如果元组直接或间接地包含了可变对象,那么它就不能用作关键字。列表不能用作关键字,因为列表可以通过索引、切片或 append() 和 extend() 之类的方法来改变。
理解字典的最好方式,就是将它看做是一个 键: 值 对的集合,键必须是唯一的(在一个字典中)。一对花括号可以创建一个空字典:{} 。另一种初始化字典的方式是在一对花括号里放置一些以逗号分隔的键值对,而这也是字典输出的方式。
>>> d={'Michael':95,'Bob':75,'Tracy':85}
>>> d
{'Michael': 95, 'Bob': 75, 'Tracy': 85}
为什么dict查找速度这么快?
相比list,dict的方法是先在字典的索引表里(比如部首表)查这个字对应的页码,然后直接翻到该页,找到这个字。无论找哪个字,这种查找速度都非常快,不会随着字典大小的增加而变慢。
>>> d['Bob']
75
要避免key不存在的错误,有两种办法,一是通过in判断key是否存在:
>>> 'Thomas' in d
False
二是通过dict提供的get()方法,如果key不存在,可以返回None,或者自己指定的value:
注意:返回None的时候Python的交互环境不显示结果。
>>> d.get('Bob')
75
>>> d.get('Thomas')
字典主要的操作是使用关键字存储和解析值。也可以用 del 来删除一个键值对。如果你使用了一个已经存在的关键字来存储值,那么之前与这个关键字关联的值就会被遗忘。用一个不存在的键来取值则会报错。
对一个字典执行 list(d) 将返回包含该字典中所有键的列表,按插入次序排列 (如需其他排序,则要使用 sorted(d))。
>>> list(d)
['Michael', 'Bob', 'Tracy']
>>> sorted(d)
['Bob', 'Michael', 'Tracy']
>>> del d['Bob']
>>> d
{'Michael': 95, 'Tracy': 85}
dict() 构造函数可以直接从键值对序列里创建字典。
>>> dict([('sape',4369),('guide',4127),('Jack',4089)])
{'sape': 4369, 'guide': 4127, 'Jack': 4089}
>>> {x:x**2 for x in (2,4,6)}
{2: 4, 4: 16, 6: 36}
2.集合
set和dict类似,也是一组key的集合,但不存储value。由于key不能重复,所以,在set中,没有重复的key。
要创建一个set,需要提供一个list作为输入集合:
>>> s=set([1,2,3])
>>> s
{1, 2, 3}
注意,传入的参数[1, 2, 3]是一个list,而显示的{1, 2, 3}只是告诉你这个set内部有1,2,3这3个元素,显示的顺序也不表示set是有序的。。
重复元素在set中自动被过滤:
>>> a=set([1,1,2,2,3,3])
>>> a
{1, 2, 3}
通过add(key)方法可以添加元素到set中,可以重复添加,但不会有效果:
>>> s.add(3)
>>> s
{1, 2, 3}
通过remove(key)方法可以删除元素:
>>> s.remove(3)
>>> s
{1, 2}
set可以看成数学意义上的无序和无重复元素的集合,因此,两个set可以做数学意义上的交集、并集等操作:
>>> s1=set([1,2,3])
>>> s2=set([2,3,4])
>>> s1&s2
{2, 3}
>>> s1|s2
{1, 2, 3, 4}
>>> s1-s2
{1}
当然含有对应的方法:
>>> c=s1.intersection(s2)
>>> print(c)
{2, 3}
>>> c=s1.union(s2)
>>> c
{1, 2, 3, 4}
>>> c=s1.difference(s2)
>>> c
{1}
通过一个集合去更新另一个集合:
>>> x={1,2,3}
>>> y={2,3,4}
>>> x.update(y)
>>> print(x)
{1, 2, 3, 4}
我们也可以去生成一个不可变集合,冻结后集合不能再添加或删除任何元素:
>>> a=frozenset(range(10))
>>> print(a)
frozenset({0, 1, 2, 3, 4, 5, 6, 7, 8, 9})
小结:
使用key-value存储结构的dict在Python中非常有用,选择不可变对象作为key很重要,最常用的key是字符串。