赞
踩
序列 | list | tuple | dict | set | deque |
---|---|---|---|---|---|
能否增加元素 | √ | × | √ | √ | √ |
是否有序 | √ | √ | × | × | √ |
能否删除 | √ | × | √ | √ | √ |
可否哈希 | × | √ | × | × | × |
序列 | list | tuple | dict | set | deque |
---|---|---|---|---|---|
增加方法 | append、extend、insert | × | update | add、update | append/appendleft、extend/extendleft (py3增加了copy/index/insert方法,这里py3也有insert) |
删除方法 | pop、remove | × (tuple只有count和index两个方法) | pop、clear(这两个是方法)/del(函数) del dict/dict[key] | pop、remove | 和list类似,但多一个popleft(它和其他的区别在于双端,append/extend/pop都多一个left) |
优点(只是部分) | 功能相对比较齐全 | 可以生成器,占内存小,安全,遍历速度比list快,可一赋多值 | 查找和插入速度快 | 不用判断重复的元素 | 插入速度快 |
缺点 | 相对tuple占内存,查找和insert时间较慢 | 不能添加和更改元素 | 占内存大 | 不能存储可变对象,例如list | remove和获取索引的时候比较慢 |
常见时间复杂度说明(按复杂度从小到大的顺序,不包含k那个):
- O(1):常数阶,意思即时间保持在一个固定的范围内,不会随序列的长度和大小而增长。例如哈希。
- O(log n):对数阶,log没有标明底数的时候默认是以2为底N的对数,例如n在原来的程度上翻了8倍,则时间复杂度翻了log8=3倍。就是2的3次方等于8,反过来知道底数和总数,求指数。因为是2的倍速,反过来想就是每次查找可以减少一半的可能。当n越大,则耗时增大log n倍。如二分查找。
- *O(n):线性阶,时间与序列的大小成正比,即序列元素越多,越长,所花时间越多。例如一般的for循环。
- O(nlog n):线性对数阶,是n倍的log n。还是假设n为8,则8 x log8=8 x 3 = 24倍。 跟O(n)一样受常数n的影响,但O(nlog n)复杂度高于O(n)。如归并排序、快速排序、堆排序。(快速排序最差的情况是O(n^2),但它的常数因子很小,大多数情况下表现比归并要好)
- O(n^2):平方阶,对n个数的排序,需要循环nn次。n越大结果复杂度就翻倍的增长,例如冒泡排序、插入排序、选择排序。
- *O(k):官网上说,“n”是容器中当前的元素的数量。'k’是参数的值或参数中元素的数量。根据查阅,目前涉及到k的算法是桶排序、计数排序、基数排序,但是目前还未涉略,也不涉及本章内容,有兴趣可以自己去查查看。
关于算法,可以参考我另一篇:https://blog.csdn.net/qq_28304687/article/details/126820544
平均情况下:
序列 | list | deque | dict | set |
---|---|---|---|---|
insert | √ O(n) | × | × | × |
append | √ O(1) | √ O(1) | × | × |
appendleft | × | √ O(1) | × | × |
extend | √ O(k) | √ O(1) | × | × |
extendleft | × | √ O(1) | × | × |
add | × | × | × | √ O(1) |
update | × | × | √ O(1) | √O(1) |
remove | √ | √O(n) | × | √ |
clear | × | √ | √ | √ |
del | √ O(n) | √ | √ O(1) | √ |
popleft | × | √ O(1) | × | × |
pop last(pop()[list]) | √ O(1) | √ O(1) | × | × |
pop(index[list]/key[dict]) | √ O(k) | √ O(1) | √ O(1) | × |
popitem() | × | × | √ O(1) | × |
Iteration(迭代) | √ O(n) | √ | √ O(n) | √ O(n) |
x in s (查找) | √ O(n) | √ O(n) | √ O(1) | √ O(1) |
a = set([1,2,3])
和b = {1,2,3}
,a和b的结果你都会得到set类型的结果{1, 2, 3}
,但如果你想初始化一个空的set对象,你必须c = set()
,如果你用c = {}初始化,c的type会是dict。
set(i for i in range(n))
比set([i for i in range(n)])
要快一些,因为前者用到了生成器,但是如果要遍历,取元素来用的话,后者可能更快(参考链接9)for i in lst[:]
类似的操作再remove参考链接:
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。