dict
#!/usr/bin/env python3 # -*- coding: utf-8 -*- #dict >>> d = {'Michael': 95, 'Bob': 75, 'Tracy': 85} >>> d['Michael'] 95 >>> d['Adam'] = 67 >>> d['Adam'] 67 >>> d['Jack'] = 90 >>> d['Jack'] 90 >>> d['Jack'] = 88 >>> d['Jack'] 88 >>> d['Thomas'] Traceback (most recent call last): File "<stdin>", line 1, in <module> KeyError: 'Thomas' >>> 'Thomas' in d False >>> d.get('Thomas') # 这里返回None,命令交互行不会显示 >>> d.get('Thomas', -1) #返回子集指定的value -1 >>> d.pop('Bob') #pop(key)方法,对应的value都会删除 75 >>> d {'Jack': 88, 'Tracy': 85, 'Michael': 95, 'Adam': 67}
dict内部存放的顺序和key放入的顺序是没有关系的
和list相比较,dict有以下几个特点:
1.查找和插入的速度极快,不会顺着key的增加而增加
2.需要占用大量的内存,内存浪费多
而list相反:
1.查找和插入的时间随着元素的增加而增加;
2.占用空间小,浪费内存很少。
所以,dict是用空间来换取时间的一种方法。
dict可以用在需要高速查找的很多地方。
需要牢记的第一条就是dict的key必须是不可变对象。
这是因为dict根据key来计算value的存储位置,如果每次计算
相同的key得出结果不同,那dict内部就完全混乱了。这个通过key
计算位置的算法就是哈希算法(Hash)。
要保证hash的正确性,作为key的对象就不能变。
在Python中,字符串、整数等都是不可变的。
而list是可变的,就不能作为key。
>>> key = [1, 2, 3] >>> d[key] = 'a list' Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: unhashable type: 'list'
set
#!/usr/bin/env python3 # -*- coding: utf-8 -*- #创建set需要提供一个list作为输入集合 >>> s = set([1, 2, 3]) >>> s {1, 2, 3} >>> s = set([1, 1, 2, 2, 3, 3]) #重复元素在set中自动被过滤 >>> s {1, 2, 3} >>> s.add(4) #添加元素 >>> s {1, 2, 3, 4} >>> s.add(4) #添加重复元素,不会有效果 >>> s {1, 2, 3, 4} >>> s.remove(4) #删除元素 >>> s {1, 2, 3} >>> s1 = set([1, 2, 3]) >>> s2 = set([2, 3, 4]) >>> s1 & s2 #交集 {2, 3} >>> s1 | s2 #并集 {1, 2, 3, 4} #再谈不可变对象 >>> a = ['c', 'b', 'a'] >>> a.sort() >>> a ['a', 'b', 'c'] >>> a = 'abc' >>> b = a.replace('a', 'A') #这里虽然对a进行操作 #但是实际是产生了一个新字符串,并让b指向新字符串 >>> b 'Abc' >>> a 'abc'
对于不可变对象来说,调用对象自身的任意方法,也不会改变该对象自身的内容,相反,这些方法会创建新的对象并返回,这样,就保证了不可变本身永远是不可变的。