老王python之基本数据结构——列表
1、列表的四个基本特点
- ### 1. 有序的集合
- ### 2. 通过偏移来索引,从而读取数据
>>> a = [1,2,3,4]
>>> a[1]
2
- ### 3. 支持嵌套
>>> b = [[1,2,3],[4,5,6]]
>>> b
[[1, 2, 3], [4, 5, 6]]
- ### 4. 可变类型
>>> id(b)
139767049435184
>>> b[0][1] = 7
>>> b
[[1, 7, 3], [4, 5, 6]]
>>> id(b)
139767049435184
2、列表的切片
- ### 1. 正向索引
- 正向索引是从左向右索引,格式为
list[startindex:endindex:step]
- 正向索引是从左向右索引,格式为
>>> a = [1,2,3,4,5,6,7]
>>> a[1:4:1]
[2, 3, 4]
- ### 2. 反向索引
- 反向索引是从右向左索引,格式和正向索引相同,不过最后一个的index为-1
>>> a[-1:-4:-1]
[7, 6, 5]
- 反向索引是从右向左索引,格式和正向索引相同,不过最后一个的index为-1
- ### 3. 默认索引
- 默认索引表示想要哪些数值,就把哪些数值表示出来,格式也和正向索引相同,比如下面的python shell中表示想要把列表a中的2,4,6拿出来
>>> a[1::2] #表示从索引为1的开始,一直到列表结束,步长为2
[2, 4, 6]
- 默认索引表示想要哪些数值,就把哪些数值表示出来,格式也和正向索引相同,比如下面的python shell中表示想要把列表a中的2,4,6拿出来
3、列表的添加操作
- ### 1. +
生成一个新的列表
>>> a = [1,2,3]
>>> a+b
[1, 2, 3, 4, 5, 6]
- ### 2. extend
接受参数并将该参数的每个元素都添加到原有的列表中,原地修改列表而不是新建列表,格式为L.extend(iterable)
>>> id(a)
139767048765520
>>> a.extend(b)
>>> a
[1, 2, 3, 4, 5, 6]
>>> id(a) #通过id查看可以看出,添加之后的列表还是a,并不是新建了一个列表
139767048765520
- ### 3. append
添加任意对象到列表的末端,格式为L.qppend(object)
>>> a = [1,2,3]
>>> a.append(4)
>>> a
[1, 2, 3, 4]
>>> a.append([4,5,6])
>>> a
[1, 2, 3, 4, [4, 5, 6]]
- ### 4. insert
插入任意对象到列表中,可以控制插入的位置,格式为L.insert(index,object)
>>> a.insert(1,'ab')
>>> a
[1, 'ab', 2, 3, 4, [4, 5, 6]]
4、列表的修改操作
- 修改列表本身只需要直接赋值即可
>>> a = [1,2,3]
>>> a[1] = 'python'
>>> a
[1, 'python', 3]
5、列表的删除操作
- ### 1. del
通过索引删除指定位置的元素
>>> a = [1,2,3,4,4]
>>> del a[0]
>>> a
[2, 3, 4, 4]
- ### 2. remove
格式为L.remove(value)
,直接删除指定的列表元素值,移除列表中指定值的第一个匹配值。如果没有找到的话,抛出异常
>>> a
[2, 3, 4, 4]
>>> a.remove(4)
>>> a
[2, 3, 4]
>>> a.remove(5)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: list.remove(x): x not in list
- ### 3. pop
格式为L.pop([index])
,index默认为最后一个,返回最后一个元素,并从list中删除它
>>> a
[2, 3, 4]
>>> a.pop()
4
>>> a
[2, 3]
6、列表的成员关系
in ,not in可以用来判断一个元素是否再列表中,返回一个bool类型,如果是用in来判断的话,如果元素在列表里面,返回True,否则返回Falsse;用not in判断的话,结果刚好相反
>>> a = [1,2,3]
>>> 1 in a
True
>>> 4 in a
False
>>> 3 not in a
False
>>> 5 not in a
True
7、列表推导式
- ### 1. 常用的列表推导式
- 结构为
[expr for iter_var in iterable]
,expr表示的是表达式,iner_var表示迭代变量,iterable表示迭代器 - 定义:首先定义迭代器iterable里所有内容,每一次迭代,都把迭代器iterable里的所有内容放入到迭代变量iter_var中,再到表达式expr中应用迭代变量iter_var的内容,最后用表达式的计算值生成一个列表
- 结构为
##比如要生成一个1到10的列表
>>> [x for x in range(1,11)]
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
>>> range(1,11) #range(start,end[,step]),步长step默认为1
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
- ### 2. 加入判断语句的列表推导式
- 结构为
[expr for iter_var in iterable if cond_expr]
- 定义:只有满足条件的内容才把iterable里对应的内容放到iter_var中,再再表达式中应用iter_var中的内容,最后用表达式的计算值生成一个列表
##比如要生成一个1到10的奇数列表
>>> range(1,11,2)
[1, 3, 5, 7, 9]
>>> [x for x in range(1,11) if x % 2 == 1]
[1, 3, 5, 7, 9]
- 结构为
8、列表的排序翻转
列表的排序翻转主要用的是sort和reverse,这个方法直接修改原列表
- ### 1. sort
正序排序,直接修改原列表,所以它的返回值为None
>>> a = [22,11,33,44]
>>> b = a.sort()
>>> b
>>> a
[11, 22, 33, 44]
- ### 2. reverse
翻转,也是原地进行翻转,返回值为None
>>> a
[11, 22, 33, 44]
>>> a.reverse()
>>> a
[44, 33, 22, 11]
列表扩展(应用)
1、内置list方法
返回一个列表,参数是可迭代对象。输出的内容还是保持了传入的可迭代对象的元素和顺序,如果参数为空,则返回一个空的列表
>>> a = 'asd'
>>> list(a)
['a', 's', 'd']
>>> b = ''
>>> list(b)
[]
2、xrange和range的区别
2.1 xrange用法
用法为xrange(start,end[, step]),步长step默认为1
xrange直接生成一个xrange对象
>>> a = xrange(1,10) >>> a xrange(1, 10)
2.2 xrange和range的区别
- range:直接生成一个列表对象
- xrange:直接生成一个xrange对象
2.3 xrange主要用处
- 当我们需要一个非常大的数据,并且内存比较吃紧的时候,我们可以用xrange来操作节省内存
- xrange一般用在循环里面,比如我们只需要操作部分数据,而不用返回全部元素来完成操作,推荐使用xrange
3、列表推导式再应用
- ### 例题
- 1、取出1-100所有值的平方
>>> [x*x for x in range(1,101)]
[1, 4, 9, 16, 25, 36, 49, 64, 81, 100, 121, 144, 169, 196, 225, 256, 289, 324, 361, 400, 441, 484, 529, 576, 625, 676, 729, 784, 841, 900, 961, 1024, 1089, 1156, 1225, 1296, 1369, 1444, 1521, 1600, 1681, 1764, 1849, 1936, 2025, 2116, 2209, 2304, 2401, 2500, 2601, 2704, 2809, 2916, 3025, 3136, 3249, 3364, 3481, 3600, 3721, 3844, 3969, 4096, 4225, 4356, 4489, 4624, 4761, 4900, 5041, 5184, 5329, 5476, 5625, 5776, 5929, 6084, 6241, 6400, 6561, 6724, 6889, 7056, 7225, 7396, 7569, 7744, 7921, 8100, 8281, 8464, 8649, 8836, 9025, 9216, 9409, 9604, 9801, 10000]
- 2、**生成的不止是数字**
- 2.1 生成字符串
```
>>> ['this %s' % x for x in range(10)]
['this 0', 'this 1', 'this 2', 'this 3', 'this 4', 'this 5', 'this 6', 'this 7', 'this 8', 'this 9']
```
- 2.2 生成元组
```
>>> [(x,y) for x in range(4) for y in range(2)]
[(0, 0), (0, 1), (1, 0), (1, 1), (2, 0), (2, 1), (3, 0), (3, 1)]
```
- 2.3 生成字典
```
>>> dict([(x,y) for x in range(4) for y in range(2)])
{0: 1, 1: 1, 2: 1, 3: 1}
```
4、再谈引用
>>> a = ['i','am','hanmeimei']
>>> b = a
>>> a
['i', 'am', 'hanmeimei']
>>> id(a)
139767049512864
>>> id(b) ##说明b和a引用的是同一段列表对象
139767049512864
>>> b[2] = 'lilei'
>>> b #列表可以在原地进行修改,并且它们指向同一段列表对象
['i', 'am', 'lilei']
>>> id(b)
139767049512864
>>> a
['i', 'am', 'lilei']
>>> del b #就是删除了对这一段列表对象的一次引用
>>> a
['i', 'am', 'lilei']
5、再议删除
del a
:删除列表对象的引用del a[:]
:清空列表对象里的元素
>>> a = [1,2,3]
>>> b = a
>>> del a
>>> a
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'a' is not defined
>>> b #只是删除了列表对象的一次引用
[1, 2, 3]
>>> c = b
>>> del c[:]
>>> c
[]
>>> b #把该列表对象里面的元素全部删除
[]