列表list

list是有序的,可重复,元素类型可以不一样,通过下标来访问不同位置的元素

列表排序

列表合并

列表复制

Python 中赋值语句不复制对象,而是在目标和对象之间创建绑定 (bindings) 关系。来源

Python 中,列表的复制有两种方式:浅拷贝和深拷贝。它们之间的区别在于,新对象的元素是否与原对象里的元素共享内存

浅拷贝,指的是重新分配一块内存创建一个新的对象,但新对象里面的元素是原对象中各个子对象的引用

深拷贝,是指重新分配一块内存,创建一个新的对象,并且将原对象中的元素,以递归的方式,通过创建新的子对象拷贝到新对象中。因此,新对象和原对象没有任何关联

直接赋值

原列表和新列表指向同一个列表对象id相同

浅拷贝

浅拷贝会分配一个新的内存空间,创建一个新的对象,id互不相同。列表元素需要分可变对象和不可变对象讨论。

不可变对象(数值型、字符串型、元组):根据不可变对象特性(值改变时,换地址),虽浅拷贝后两对象指向同一地址,但任一对象(如b)改变时,原来内存的值不变,而b指向新的内存地址,故互相不影响。即不可变对象的浅拷贝互不影响。

可变对象(列表、字典、集合):根据可变对象特点(地址不变,值变化),可变对象改变时,指向同一地址的新对象、原对象都改变。

深拷贝

深拷贝是完全开辟新空间,将原对象中的所有元素通过递归的方式进行拷贝到新对象中。

参考:

https://zhuanlan.zhihu.com/p/258097244 https://pythonjishu.com/vbrbsayfccmqakg/ https://www.zadmei.com/rhzpzsdf.html

元组tuple

tuple元组类型与list类似,但是tuple的元素不能修改

字典dict

字典与列表最大的区别就是字典强调的是“键值对”,key与value一一对应。

判断dict中key是否存在

字典合并

【方法一】借助dict(d1.items() + d2.items())的方法 仅Python2

备注:

  1. d1.items()获取字典的键值对的列表
  2. d1.items() + d2.items()拼成一个新的列表
  3. dict(d1.items()+d2.items())将合并成的列表转变成新的字典

【方法二】借助字典的update()方法

【方法三】借助字典的dict(d1, **d2)方法

【方法四】使用联合运算符方法 (Python 3.9)

collections.Counter

用于统计某序列中每个元素出现的次数,以键值对的方式存在字典中。但类型其实是Counter。

多维列表

多层嵌套列表

集合set

set集合与list也类似,但是集合中的元素是无序的,且会自动除去重复元素,通常是用来进行去重

生成器/迭代器

迭代器 iterator

在Python中,我们把所有可以迭代的对象统称为可迭代对象Iterable

判断一个对象是否为可迭代对象或迭代器:

使用迭代器实现斐波那契数列:

生成器 generator

如果一个函数体内部使用yield关键字,这个函数就称为生成器函数,生成器函数调用时产生的对象就是生成器。生成器是一个特殊的迭代器,在调用该生成器函数时,Python会自动在其内部添加 __iter__() 方法和 __next__() 方法。把生成器传给 next() 函数时, 生成器函数会向前继续执行, 执行到函数定义体中的下一个 yield 语句时, 返回产出的值, 并在函数定义体的当前位置暂停, 下一次通过next()方法执行生成器时,又从上一次暂停位置继续向下……,最终, 函数内的所有yield都执行完,如果继续通过yield调用生成器, 则会抛出StopIteration 异常——这一点与迭代器协议一致。

使用生成器实现斐波那契数列:

使用普通循环实现斐波那契数列:

推导式

列表推导式

List comprehensions

字典推导式

Dictionary Comprehension

字典推导式的基本格式,和 列表推导式相似,只是把 [] 改成了 {}

集合推导式

Set comprehensions

集合推导式跟列表推导式也是类似的。唯一的区别在于它使用大括号{},组成元素也只要一个。

生成器推导式

Generator Comprehensions

生成器推导式跟列表推导式,非常的像,只是把 [] 换成了 ()

其他函数

product

可以通过内置的 product() 函数避免 Python 中的嵌套循环。 product 用于求多个可迭代对象的笛卡尔积(Cartesian Product),它跟嵌套的 for 循环等价.即: product(A, B)((x,y) for x in A for y in B) 和 嵌套的 for 循环 结果一样。

2层循环示例:

3层循环示例:

product改造

转换格式

map

map 函数会将函数应用于可迭代对象的每个元素

reduce

将一个函数应用到一个可迭代对象中,并为其执行累积操作