文章目录
  1. 1. 列表
  2. 2. 字典
  3. 3. 集合
  4. 4. 字符串和元组

或许对于英语用户而言,各种编程语言中的函数都很好记吧,但是对于我……分不清popremove有什么区别,还是记一下吧。

列表

列表可以随机访问,如果用for .. in ..也是按顺序的,可以用+连接,或者用*重复。有以下常用操作:

1
2
3
4
a.append(value)         # 在末尾添加元素
a.insert(index, value) # 在 index 处插入元素(原 index 处及之后元素后移)
a.pop(index) # 删除 index 处的元素(返回删除的元素)
a.remove(value) # 删除列表中第一个等于 value 的元素

以上都是原位修改,除pop以外都没有返回值。

那么问题来了,怎么才能删除列表中符合条件的某些元素呢?自然会想到for循环,但是删除过程中列表长度会变化,到底循环了几次呢?

经过用remove验证,循环次数大概会随着列表长度变化动态变化,因而下面的代码没有问题

1
2
3
4
5
6
7
a = [2, 5, 1, 7, 0, 3, 4]
for i in a:
if i < 3:
a.remove(i)
print(a)
# [5, 7, 3, 4]
# 只循环四次,没有索引溢出问题,而且达到了目的

相比之下,用pop就必须先保存一份拷贝,并且考虑后续元素序号的变化,很不方便:

1
2
3
4
5
6
7
b = deepcopy(a)
num_deleted = 0
for i in range(len(b)):
if b[i] < 3:
a.pop(i - num_deleted)
num_deleted += 1
print(a)

但是,remove并不是最佳方案,不要忘了列表解析!

1
a = [i for i in a if not i < 3]

或者更省事的方法,直接使用numpy库,把列表做成ndarray对象,不过ndarray对象需要先定好内存空间,灵活性不足了。

相比之下,插入问题就没什么好办法了,只能像pop一样多引入变量计算着插入数,幸好这种操作很少用到。

字典

字典的键是没有顺序的,而值可以使用键索引随机访问。注意for .. in ..遍历的是键而不是值,常用操作比较少:

1
2
3
a.keys()    # 返回键列表(其实是一个类似列表的对象)
a.pop(key) # 删除键为 key 的键值(返回删除的值)
a.update(b) # 把字典 b 中的键值添加到 a 中

没有insert,因为需要新的键值的话直接赋值即可。如果要合并字典,不能用+,可以使用3.5起改进的解包语法:

1
result = {**dict1, **dict2}   # 漂亮!

集合

集合也是用{}表示,因而为了防止与空字典混淆,声明空集的话,要用a = set()。无法随机访问,只能用遍历的方法,集合的运算符比较独特:

1
2
3
a & b # a 交 b
a | b # a 并 b
a - b # a 与 b 的差集

其中b也是集合。因为元素不能重复,也就没有更多复杂问题了。(集合的pop()方法是不取参数的,效果是随机删除并返回一个值……)

字符串和元组

共同的特点是不能原位更改,更多的……用到再说吧,毕竟字符串处理是个复杂的问题。

文章目录
  1. 1. 列表
  2. 2. 字典
  3. 3. 集合
  4. 4. 字符串和元组