本节内容:

  • 列表
  • 元组
  • 字符串
  • 集合
  • 字典

python的split如何从后往前切分 python列表从后往前取_List

本节先介绍列表。

 

一、列表



一种容器类型。列表可以包含任何种类的对象,比如说数字、子串、嵌套其他列表、嵌套元组。



任意对象的有序集合,通过索引访问其中的元素。其长度可变,支持异构(在一个列表中可以包含多种不同类型的元素),可以任意嵌套。



列表是可变对象,支持在原处修改。列表的可变变现在其内部的每一个元素存储在列表中不是对象本身,而是对象的引用。因此其修改的是对象的引用。



help()是ipython里特有的函数,可以打印出类、函数的一些信息。




In [1]: help(list)

Help on class list in module builtins:

class list(object)
 |  list() -> new empty list
 |  list(iterable) -> new list initialized from iterable's items
 |  
 |  Methods defined here:
 |  
 |  __add__(self, value, /)
 |      Return self+value.
 |  
 |  __contains__(self, key, /)
 |      Return key in self.
 |  
 |  __delitem__(self, key, /)
 |      Delete self[key].
 |  
 |  __eq__(self, value, /)
 |      Return self==value.
 |  
 |  __ge__(self, value, /)
 |      Return self>=value.
 |  
 |  __getattribute__(self, name, /)
 |      Return getattr(self, name).
 |  
 |  __getitem__(...)
 |      x.__getitem__(y) <==> x[y]
 |  
 |  __gt__(self, value, /)
 |      Return self>value.
 |  
 |  __iadd__(self, value, /)
 |      Implement self+=value.
 |  
...



  

1. 初始化列表



list(),里面可以什么都不放,也可以放可迭代对象。



直接一个[]




In [2]: lst = list()

In [3]: lst = []

In [4]: lst
Out[4]: []

In [5]: lst = [1, 2, 3]

In [6]: lst
Out[6]: [1, 2, 3]



  

2. 下标/索引操作



python中list的索引从0开始。绝大多数语言的下标是从0开始的,也有少部分例外,比如awk、lua。



负数的索引表示从后往前数,由-1开始,-1表示最后一个元素。




In [6]: lst
Out[6]: [1, 2, 3]

In [7]: lst[0]
Out[7]: 1

In [8]: lst[-1]
Out[8]: 3



如果索引超出范围,将引发IndexError。




In [9]: lst[-4]
---------------------------------------------------------------------------
IndexError                                Traceback (most recent call last)
<ipython-input-9-7ea420056b9a> in <module>()
----> 1 lst[-4]

IndexError: list index out of range

In [10]: lst[3]
---------------------------------------------------------------------------
IndexError                                Traceback (most recent call last)
<ipython-input-10-298ffefac8cf> in <module>()
----> 1 lst[3]

IndexError: list index out of range



修改元素的时候,如果超出索引范围,也会引发IndexError。



python的split如何从后往前切分 python列表从后往前取_List_02

 

python的split如何从后往前切分 python列表从后往前取_数据结构与算法_03

  

 

3. 列表的操作

  • 增:append、extend、insert
  • 删:clear、pop、remove
  • 改:reverse、sort
  • 查:count、index
  • 其他:copy

 


(1)给list增加元素


append:

python的split如何从后往前切分 python列表从后往前取_lua_04

python的split如何从后往前切分 python列表从后往前取_解包_05


append方法原地修改list,给list最后增加一个元素。append方法的返回值是None。


 

insert:

python的split如何从后往前切分 python列表从后往前取_解包_06

python的split如何从后往前切分 python列表从后往前取_python_07

python的split如何从后往前切分 python列表从后往前取_数据结构与算法_08

python的split如何从后往前切分 python列表从后往前取_List_09

python的split如何从后往前切分 python列表从后往前取_数据结构与算法_10


insert方法操作的索引超出范围时,如果是正索引,等效于append,如果是负索引,等效于insert(0, object)


insert的时间复杂度是O(n),append的时间复杂度是O(1)。因为insert是要做一个遍历的。


 


extend:

python的split如何从后往前切分 python列表从后往前取_python_11

python的split如何从后往前切分 python列表从后往前取_lua_12

python的split如何从后往前切分 python列表从后往前取_List_13


extend的时间复杂度是O(n),这个n是可迭代对象的长度,并不是原有list的长度n。


 


(2)删除元素

pop:


可以传入index,默认从最后移除一个元素,并且把这个元素返回回来。


python的split如何从后往前切分 python列表从后往前取_解包_14

python的split如何从后往前切分 python列表从后往前取_数据结构与算法_15

python的split如何从后往前切分 python列表从后往前取_List_16


index默认是-1,即最后一个元素,如果index超出索引范围,会抛出IndexError。


 


remove:

python的split如何从后往前切分 python列表从后往前取_解包_17

python的split如何从后往前切分 python列表从后往前取_解包_18

python的split如何从后往前切分 python列表从后往前取_python_19


pop是弹出索引对应的值,remove是删除最左边的一个值。


pop针对的是索引,remove针对的是值。


python的split如何从后往前切分 python列表从后往前取_python_20


remove的时候,如果值不存在,会抛出ValueError。


python的split如何从后往前切分 python列表从后往前取_python_21

 

pop和remove的时间复杂度都是O(n)


 


clear:


python的split如何从后往前切分 python列表从后往前取_lua_22

python的split如何从后往前切分 python列表从后往前取_数据结构与算法_23


clear方法删除列表的所有元素。


 


(4)查找/统计元素


可以利用index查询


python的split如何从后往前切分 python列表从后往前取_python_24

 

index:


python的split如何从后往前切分 python列表从后往前取_解包_25

python的split如何从后往前切分 python列表从后往前取_解包_26

 

python的split如何从后往前切分 python列表从后往前取_List_27

python的split如何从后往前切分 python列表从后往前取_lua_28


start包含,stop不包含。即[start, stop)


index方法根据值查找索引。


 


count:


python的split如何从后往前切分 python列表从后往前取_解包_29

python的split如何从后往前切分 python列表从后往前取_python_30


count返回指定的value在List中出现的次数。


len函数


不是List的方法,它是python的一个内置函数,用于检查List元素个数。并不仅仅是针对List,可以针对很多对象。


python的split如何从后往前切分 python列表从后往前取_python_31

python的split如何从后往前切分 python列表从后往前取_lua_32

 


(5)修改列表


sort:

python的split如何从后往前切分 python列表从后往前取_List_33


原处是指直接修改List


python的split如何从后往前切分 python列表从后往前取_解包_34

 


reverse:


python的split如何从后往前切分 python列表从后往前取_数据结构与算法_35


原处是指直接修改List


python的split如何从后往前切分 python列表从后往前取_python_36

 


(6)其他方法


copy:

 

python的split如何从后往前切分 python列表从后往前取_数据结构与算法_37


如何删除后面的2?


python的split如何从后往前切分 python列表从后往前取_数据结构与算法_38


如果不想在原List上做修改:


python的split如何从后往前切分 python列表从后往前取_lua_39


lst2 = lst,只是一个指针指到lst指到的那块内存,因此操作lst2的时候,lst也被修改了。因为它们两个都是指针,指到同一块内存。这就用到List的copy函数了。


python的split如何从后往前切分 python列表从后往前取_List_40


搞错了,不是深copy,只是一层copy。


python的split如何从后往前切分 python列表从后往前取_数据结构与算法_41

 

id()打印出引用指向的内存块的地址。


 


成员关系判断


  • in


  • not in

 

python的split如何从后往前切分 python列表从后往前取_List_42


【举例】:如何去除List中的重复元素


python的split如何从后往前切分 python列表从后往前取_数据结构与算法_43

 


列表相加:合并两个列表,生成了一个新列表。不会修改原列表。这个和子串的相加是一样的,生成新的子串。


python的split如何从后往前切分 python列表从后往前取_数据结构与算法_44

python的split如何从后往前切分 python列表从后往前取_数据结构与算法_45

 


序列相乘:就是重复元素多次。都是生成新对象。


子串乘法:


python的split如何从后往前切分 python列表从后往前取_List_46


列表乘法:


python的split如何从后往前切分 python列表从后往前取_python_47

 

 

4. 切片


切片通常是用来访问数据的,如果你对切片赋值的话,产生的结果是不可预料的。切片操作总是返回一个新的list,不会改变原有的list


python的split如何从后往前切分 python列表从后往前取_lua_48

 

python的split如何从后往前切分 python列表从后往前取_数据结构与算法_49

 

seq[start, end]     [start, end)


python的split如何从后往前切分 python列表从后往前取_数据结构与算法_50

  

python的split如何从后往前切分 python列表从后往前取_数据结构与算法_51


如果想获取到最后一个元素,省略end


python的split如何从后往前切分 python列表从后往前取_lua_52

 

 


以上都是从左往右切片,所以左边的数字要小于右边的数字。


python的split如何从后往前切分 python列表从后往前取_数据结构与算法_53


start超出索引范围从0开始,end超出索引范围到到len(lst)结束。


python的split如何从后往前切分 python列表从后往前取_数据结构与算法_54

 

 


start为0时可以省略,end省略表示打印到最后一个元素,start和end都省略就是copy。


python的split如何从后往前切分 python列表从后往前取_List_55

 


切片还有一个第3个参数:step,默认是1


python的split如何从后往前切分 python列表从后往前取_数据结构与算法_56

 

当step为负数的时候,从后往前数,此时start应该大于end,否则返回空列表。

 

python的split如何从后往前切分 python列表从后往前取_List_57

 

python的split如何从后往前切分 python列表从后往前取_python_58

python的split如何从后往前切分 python列表从后往前取_解包_59

 

 


切片赋值


python的split如何从后往前切分 python列表从后往前取_数据结构与算法_60

python的split如何从后往前切分 python列表从后往前取_解包_61

python的split如何从后往前切分 python列表从后往前取_List_62


对切片赋值,会替换切片原来的元素。


 

python的split如何从后往前切分 python列表从后往前取_数据结构与算法_63

python的split如何从后往前切分 python列表从后往前取_数据结构与算法_64


通常我们是不会对切片进行赋值的,会造成很多的误解。


5. 解包/封包


看一个例子,传统的swap


python的split如何从后往前切分 python列表从后往前取_List_65


但是在python里面不需要这么做


python的split如何从后往前切分 python列表从后往前取_python_66

 

原来中间的3行代码变成了现在的1行代码,这就是解包/封包。


最简单的解包就是如下:把右边的元组或者列表(可迭代对象都行)解开成了左边的两个变量,这种就是解包。


python的split如何从后往前切分 python列表从后往前取_数据结构与算法_67

python的split如何从后往前切分 python列表从后往前取_python_68

python的split如何从后往前切分 python列表从后往前取_lua_69

 


封包就是把一组变量,变成元组。把若干变量或常量封装到一个变量里,这就是封包。


python的split如何从后往前切分 python列表从后往前取_解包_70


我们显式的使用封包比较少,但是解包用的很多。


 


应用场景:


python的split如何从后往前切分 python列表从后往前取_List_71

 

python的split如何从后往前切分 python列表从后往前取_python_72

 

python的split如何从后往前切分 python列表从后往前取_解包_73

 

 


解包是把集合里的元素赋值给变量(集合可以是可迭代对象),赋值完的变量要么是一个值,要么是个list,而不管右侧集合是列表还是元组。


封包是把变量构建成元组。下面的这种用法python2是不支持的。


python的split如何从后往前切分 python列表从后往前取_lua_74

python的split如何从后往前切分 python列表从后往前取_lua_75

 

比如我想取出list中的下标是0,1,3元素,切片是不好做的:


python的split如何从后往前切分 python列表从后往前取_解包_76

 

下划线_ 是指当我们要丢弃一个变量时使用的。


再如,我们取一头一尾:


python的split如何从后往前切分 python列表从后往前取_python_77

 

python的split如何从后往前切分 python列表从后往前取_lua_78

 


再看两个复杂点的:


python的split如何从后往前切分 python列表从后往前取_数据结构与算法_79

python的split如何从后往前切分 python列表从后往前取_数据结构与算法_80


只要两边结构是一样的,解包多少层都是可以的。