python中几种数据结构的常用操作
或许对于英语用户而言,各种编程语言中的函数都很好记吧,但是对于我……分不清pop
和remove
有什么区别,还是记一下吧。
列表
列表可以随机访问,如果用for .. in ..
也是按顺序的,可以用+
连接,或者用*
重复。有以下常用操作:
1 | a.append(value) # 在末尾添加元素 |
以上都是原位修改,除pop
以外都没有返回值。
那么问题来了,怎么才能删除列表中符合条件的某些元素呢?自然会想到for
循环,但是删除过程中列表长度会变化,到底循环了几次呢?
经过用remove
验证,循环次数大概会随着列表长度变化动态变化,因而下面的代码没有问题
1 | a = [2, 5, 1, 7, 0, 3, 4] |
相比之下,用pop
就必须先保存一份拷贝,并且考虑后续元素序号的变化,很不方便:
1 | b = deepcopy(a) |
但是,remove
并不是最佳方案,不要忘了列表解析!
1 | a = [i for i in a if not i < 3] |
或者更省事的方法,直接使用numpy
库,把列表做成ndarray
对象,不过ndarray
对象需要先定好内存空间,灵活性不足了。
相比之下,插入问题就没什么好办法了,只能像pop
一样多引入变量计算着插入数,幸好这种操作很少用到。
字典
字典的键是没有顺序的,而值可以使用键索引随机访问。注意for .. in ..
遍历的是键而不是值,常用操作比较少:
1 | a.keys() # 返回键列表(其实是一个类似列表的对象) |
没有insert
,因为需要新的键值的话直接赋值即可。如果要合并字典,不能用+
,可以使用3.5起改进的解包语法:
1 | result = {**dict1, **dict2} # 漂亮! |
集合
集合也是用{}
表示,因而为了防止与空字典混淆,声明空集的话,要用a = set()
。无法随机访问,只能用遍历的方法,集合的运算符比较独特:
1 | a & b # a 交 b |
其中b也是集合。因为元素不能重复,也就没有更多复杂问题了。(集合的pop()
方法是不取参数的,效果是随机删除并返回一个值……)
字符串和元组
共同的特点是不能原位更改,更多的……用到再说吧,毕竟字符串处理是个复杂的问题。