| 列表 | 元组 | 字典 | 集合 |
是否可变 | 可变 | 不可变 | 可变 | 可变 |
是否有序 | 有序 | 有序 | 无序 | 无序 |
元素是否重复 | 可重复 | 可重复 | 键不可重复 | 不可重复 |
定义符号 | [] | () | {key:value} | {} |
创建 | 1.[]直接创建 2.list() 3.列表解析式 | 1.()直接创建 2.tuple() | 1.{}直接创建 2.dict(key1=value1) 3.dict(zip(list1,list2)) | 1.set() (不可以使用{}来创建,那样是dict而不是set) |
删除 | 1.del删除元素或者列表 2.list.remove(value) 3.list.pop() | 1.del删除元素或元组 | 1.del删除元素或字典 2. | 1.del删除元素或集合 2.set.remove() 3.set.pop() 4.set.clear() |
修改插入 | 1.append() 2.insert() 3.+ 4.extend() | 不可修改 | 1.dict[key]=value | s.add() |
访问、遍历 | 1.索引访问 2.for循环遍历 for i in list for index,i in enumerate(list) | 1.索引访问 2.for循环遍历 | 1.键访问 2.get()访问 3.for key,value in dict.items() for key in dict.keys() for value in dict.values() | for循环遍历 |
生成式 | [i*i for i in list1]返回列表 | (i*i for i in list1)返回生成器对象,通过for和next()访问 | dict={i:j for i,j in zip(list1,list2)} dict={i*2:2 for i in range(1,10)} | 交集&,并集|,差集- |
切片 | 支持切片 | 支持切片 | 不支持切片 | 不支持切片 |
索引 | 支持索引 | 支持索引 | 不支持索引 | 不支持索引 |
+、* | 支持 | 支持 | 不支持 | 不支持 |
其他 | 不能作为字典的键 | 可以作为字典的键 |
|
|
概括几点列表、字典、集合某些操作的时间复杂度比较:
1.查找速度快,无论dict有10个元素还是10万个元素,查找速度都一样。而list的查找速度随着元素增加而逐渐下降。
不过dict的查找速度快不是没有代价的,dict的缺点是占用内存大,还会浪费很多内容,list正好相反,占用内存小,但是查找速度慢。
2.字典值可以没有限制地取任何python对象,既可以是标准的对象,也可以是用户定义的,但键不行。不允许同一个键出现两次。
键必须不可变,所以可以用数字,字符串或元组充当,所以用列表就不行。
3.关于列表内部实现是数组(具体实现要看解析器, CPython的实现 ),因此就有数组的特点。超过容量会增加更多的容量,set, get 是O(1),但del, insert, in的性能是O(n)。具体的看下表,'n’是容器中当前的元素数, 'k’需要操作的元素个数;
关于字典需要了解的是hash函数和哈希桶。一个好的hash函数使到哈希桶中的值只有一个,若多个key hash到了同一个哈希桶中,称之为哈希冲突。查找值时,会先定位到哈希桶中,再遍历hash桶。更详细的信息请点这里。在hash基本没有冲突的情况下get, set, delete, in方面都是O(1)。自己的操作不会超过O(n);
关于set内部实现是dict的。在in操作上是O(1), 这一点比list要强。
也有list不存在的差运算;