l.reverse() vs. reversed(l)
l.reverse()
方法对列表原地进行翻转,无返回值;reversed(l)
返回一个 iterator 迭代器,可以用list(reversed(l))
把它转化成列表。reverse()
只能针对列表;而reversed()
可以翻转譬如 list, tuple, string 等可迭代对象。
l = [1,2,3]
l.reverse()
---
iter_ = reversed(l)
next(iter_)
注意:调用迭代器的 next
方法会减少该迭代器内的元素,永久丢失这部分信息。如下面的例子
l = [1,2,3]
iter_ = reversed(l)
next(iter_)
list(iter_)
>>> [2,1]
l.sort() vs. sorted(l)
l.sort()
不返回值,直接原地对 l 进行排序,在原列表上修改;sorted(l)
返回一个新的排序后的列表。sort()
函数只能针对列表排序;sorted()
函数还可以对任何可迭代对象进行排序,譬如 set, dict, tuple, string…
另外,sorted(iterable, key, reverse=False)
使用更为灵活,可以指定根据何种键进行排序,并选择升序或降序。
下面是两种常见的用法:
- 计算排序后的下标列表
idx_sorted = sorted(range(len(l)), key=lambda k: l[k])
- 根据字典的 value 排序
sorted(dic, key=dic.get)
sorted(dic, key=lambda k: dic[k])
以上两种写法是等价的,第二种描述的就是 dic.get
方法
还可以指定 reverse 参数,改变大小排列顺序。默认按照升序排列;如果 reverse=True
,则按照降序排列
注意❗:排序中不会发生隐式类型转换。sorted([2, "1"])
会报错,无法比较 int 和 str 类型。
字符串:不可变对象
Python 中的字符串是不可变对象,不能在原地修改。在 Leetcode 上一些关于字符串的题解沿用 C++ 的思路,对字符串进行原地修改,对于 Python 来说是没有意义,甚至错误的。
注:C++ 中的
std:string
是可变对象;Java, Python 中的字符串均是不可变对象。
列表切片注意事项
我们知道,列表切片的步长为正数时,第一个数代表起始位置;第二个数代表结束位置;第三个数代表步长。
但当列表切片的步长为负数时,第一个数代表的是结束的位置(默认是列表末尾),第二个数代表的才是起始位置(默认是列表开头)。
变量的访问权限
对于全局可变对象(list, dictionary, set 等),在函数内部可以访问并修改。
而全局不可变对象(int, float, bool, string, tuple),在函数内部不能直接访问,需要加关键词 global
例子:不可访问 int 类型
加关键词 global
后,可以访问并修改:
可以直接访问并修改 set 类型的数据:
nonlocal 关键字
nonlocal
用于函数嵌套中的内层函数,用于访问、修改外层函数的不可变对象。(可变对象可以直接访问)
这个关键字在写回溯算法时经常用到
UnboundLocalError: local variable ‘count’ referenced before assignment
用 nonlocal
声明,该 int 类型的变量在外层函数内被定义了: