游客发表
写代码时,列表列表几乎是本操最常打交道的结构。Python 里用方括号一裹,列表数据就排成了队。本操但真正让列表好用的列表,是本操它那一套增删改查的操作。我刚开始学的列表时候,总觉得这些方法名字太长记不住,本操后来写多了才发现,列表它们其实对应着生活中整理东西的本操直觉。
先看添加。列表`append()` 把元素塞到末尾,本操像往购物车最后丢一包纸巾。列表`insert(1,本操 'x')` 则指定位置插队,第一个参数是列表索引,第二个是值。有次我写爬虫,把抓到的链接先 `append` 进列表,再统一去重,比边抓边处理省事得多。`extend()` 更干脆,把另一个列表整个倒进来,相当于合并两个购物车。注意它和 `append` 的区别:`append` 是加一个整体,`extend` 是拆开加每个元素。我见过有人把字符串传进去,结果每个字符都成了独立项,调试半天才反应过来。
删除操作里,`remove()` 按值删,只删第一个匹配项。如果列表里有重复,它不管后面那些。`pop()` 按索引删,不给参数就弹最后一个,还能接住返回值。这招在实现栈时特别顺手。`del` 语句更底层,可以删单个元素,也能切片删除,比如 `del lst[2:5]`。清空用 `clear()`,但老代码里常见 `lst[:] = []`,效果一样。我习惯用 `pop()` 处理任务队列,因为需要拿到被删掉的那个任务。
修改和查询往往绑在一起。直接 `lst[0] = 'new'` 就能替换。查索引用 `index()`,找不到会抛异常,所以得先 `in` 一下。`count()` 统计出现次数,简单但有用。切片是查询里的重头戏,`lst[1:4]` 取第二到第四个,步长还能是负数,`lst[::-1]` 直接反转。我经常用切片来复制列表,`new = old[:]`,比 `copy()` 更短。但要注意,切片是浅拷贝,嵌套列表里的子列表还是共享的,改一个另一个也变。
排序和反转算进阶操作。`sort()` 原地排,`sorted()` 返回新列表。默认升序,`reverse=True` 降序。有个坑:如果列表里混了字符串和数字,Python 3 直接报错,不像 Python 2 会强行比较。`reverse()` 只是倒序,不排序。我见过有人想降序,先 `sort()` 再 `reverse()`,其实一步 `sort(reverse=True)` 就够了。另外 `sort()` 的 `key` 参数很灵活,比如按字符串长度排:`lst.sort(key=len)`。
其他零碎但常用的:`len()` 拿长度,`min()` `max()` 找极值,`sum()` 求和。`in` 判断存在性,比 `index()` 加异常处理干净。`copy()` 做浅拷贝,和切片效果一样。列表还能相加,`[1,2] + [3]` 得到新列表,但 `+=` 是原地扩展,类似 `extend`。有次我写循环累加,用 `+=` 比 `append` 慢不少,因为每次都可能重新分配内存。后来学乖了,预先分配或直接用列表推导式。
这些操作看着简单,组合起来却能解决大部分数据整理问题。关键是根据场景选对方法:要顺序就 `append`,要位置就 `insert`,要删值就 `remove`,要删位置就 `pop`。写多了,手自然就记住了。
友情链接