python内置数据结构_Python内置数据结构--列表

本节内容:

列表

元组

字符串

集合

字典

1132141-20180426191820935-1169768361.png

本节先介绍列表。

一、列表

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

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

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

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)

in ()

----> 1 lst[-4]

IndexError: list index out of range

In [10]: lst[3]

---------------------------------------------------------------------------

IndexError Traceback (most recent call last)

in ()

----> 1 lst[3]

IndexError: list index out of range

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

1132141-20180430172642900-2037079172.png

1132141-20180430172747753-954907153.png

3. 列表的操作

增:append、extend、insert

删:clear、pop、remove

改:reverse、sort

查:count、index

其他:copy

(1)给list增加元素

append:

1132141-20180430173241317-1967905438.png

1132141-20180430173250044-1120680849.png

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

insert:

1132141-20180430173919935-1614079967.png

1132141-20180430173928579-1168824352.png

1132141-20180430173936996-168925150.png

1132141-20180430173947980-1346340652.png

1132141-20180430174048103-1805188878.png

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

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

extend:

1132141-20180430174243927-1000228294.png

1132141-20180430174253336-1622174561.png

1132141-20180430174301759-1127291674.png

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

(2)删除元素

pop:

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

1132141-20180430174529052-1658436931.png

1132141-20180430174540081-1576995356.png

1132141-20180430174549461-1311884652.png

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

remove:

1132141-20180430174808909-1609021689.png

1132141-20180430174819761-1417131259.png

1132141-20180430174829223-930852873.png

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

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

1132141-20180430174932339-115868867.png

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

1132141-20180430175022429-361688523.png

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

clear:

1132141-20180430175307670-871763387.png

1132141-20180430175319650-1715580184.png

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

(4)查找/统计元素

可以利用index查询

1132141-20180430175548432-787406680.png

index:

1132141-20180430175722886-1546917457.png

1132141-20180430175735316-1042654822.png

1132141-20180430175743183-349895340.png

1132141-20180430175753194-525821131.png

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

index方法根据值查找索引。

count:

1132141-20180430180012269-1512101883.png

1132141-20180430180020618-1177586384.png

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

len函数

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

1132141-20180430180206381-2013890040.png

1132141-20180430180214923-550504647.png

(5)修改列表

sort:

1132141-20180430180411810-1448301030.png

原处是指直接修改List

1132141-20180430180529017-621977889.png

reverse:

1132141-20180430180617155-566765712.png

原处是指直接修改List

1132141-20180430181047593-1448062215.png

(6)其他方法

copy:

1132141-20180430181152802-550460569.png

如何删除后面的2?

1132141-20180430181242362-1179845065.png

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

1132141-20180430181312769-532388928.png

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

1132141-20180430181435973-2021572690.png

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

1132141-20180430181537522-1383066436.png

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

成员关系判断

in

not in

1132141-20180430182125281-1276999592.png

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

1132141-20180430182209264-576812670.png

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

1132141-20180430182522640-1165631311.png

1132141-20180430182534981-1419477602.png

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

子串乘法:

1132141-20180430182622598-160244297.png

列表乘法:

1132141-20180430182717502-2059204968.png

4. 切片

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

1132141-20180430182918689-1321273179.png

1132141-20180430182926871-18673384.png

seq[start, end] [start, end)

1132141-20180430183036087-634982304.png

1132141-20180430183044204-804788062.png

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

1132141-20180430192108663-213624959.png

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

1132141-20180430192159322-1759288508.png

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

1132141-20180430192231655-734796151.png

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

1132141-20180430192654275-1047124063.png

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

1132141-20180430192830765-578348205.png

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

1132141-20180430192912385-937328450.png

1132141-20180430192945440-92663236.png

1132141-20180430193024462-1024295112.png

切片赋值

1132141-20180430193139873-1935931679.png

1132141-20180430193151037-655216124.png

1132141-20180430193206386-1744342331.png

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

1132141-20180430193306682-1761219173.png

1132141-20180430193318531-1140903287.png

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

5. 解包/封包

看一个例子,传统的swap

1132141-20180430193438449-1703721258.png

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

1132141-20180430193530916-856852626.png

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

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

1132141-20180430194300552-1882286953.png

1132141-20180430194355513-1595963164.png

1132141-20180430194410444-1131389881.png

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

1132141-20180430194535630-1577744642.png

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

应用场景:

1132141-20180430194705048-953473563.png

1132141-20180430194725957-1947451291.png

1132141-20180430194738624-1110309837.png

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

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

1132141-20180430194945160-1692321645.png

1132141-20180430194955514-892128313.png

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

1132141-20180430195057687-2080270308.png

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

再如,我们取一头一尾:

1132141-20180430195209409-2131273710.png

1132141-20180430195231359-734067287.png

再看两个复杂点的:

1132141-20180430195343253-1706677203.png

1132141-20180430195353489-1648614576.png

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值