Python 刷 Leetcode 总结(持续更新)

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) 使用更为灵活,可以指定根据何种键进行排序,并选择升序或降序。

下面是两种常见的用法:

  1. 计算排序后的下标列表
idx_sorted = sorted(range(len(l)), key=lambda k: l[k])
  1. 根据字典的 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 中的字符串均是不可变对象。

列表切片注意事项

我们知道,列表切片的步长为正数时,第一个数代表起始位置;第二个数代表结束位置;第三个数代表步长。

但当列表切片的步长为负数时,第一个数代表的是结束的位置(默认是列表末尾),第二个数代表的才是起始位置(默认是列表开头)

在这里插入图片描述
可参考:Python 列表与数组的切片对比


变量的访问权限

对于全局可变对象(list, dictionary, set 等),在函数内部可以访问并修改。
而全局不可变对象(int, float, bool, string, tuple),在函数内部不能直接访问,需要加关键词 global

例子:不可访问 int 类型

加关键词 global后,可以访问并修改:
在这里插入图片描述

可以直接访问并修改 set 类型的数据:
在这里插入图片描述


nonlocal 关键字

nonlocal 用于函数嵌套中的内层函数,用于访问、修改外层函数的不可变对象。(可变对象可以直接访问)

这个关键字在写回溯算法时经常用到

在这里插入图片描述

UnboundLocalError: local variable ‘count’ referenced before assignment

nonlocal 声明,该 int 类型的变量在外层函数内被定义了:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值