版权声明:本文为博主原创文章,转载请注明本文链接。文章内容如有错误望能指正,以免误导更多人。 https://blog.csdn.net/feixiangqiao/article/details/88870319
列表list
- 一个队列,一个排列整齐的队伍
- 列表内的个体称作元素,由若干元素组成列表
- 元素可以是任意对象(数字、字符串、对象、列表等)
- 列表内元素有顺序,可以使用索引
- 线性的数据结构
- 使用[]表示
- 列表是
可变
的
一、列表list定义 初始化
- list()->new empty list
- list(iterable)->new list initialized form iterables’s items
- 列表不能一开始就定义大小
lst = list()
lst = []
lst = [2,6,9,'ab']
lst = list(range(5))
二、列表索引访问
- 索引,也叫下标
- 正索引:从左至右,从0开始,为列表中每一个元素编号
- 负索引:从右至左,从-1开始
- 正负索引不可以超界,否则引起异常IndexError
- 为了理解方便,可以认为列表是从左至右排列的,左边是头部,右边是尾部* 左边是下界,右边是上界
- 列表通过索引访问
list[index],index就是索引,使用中括号访问 - 列表分类
1)列表
检索方便,增删改不方便
2)链表
增删改方便,检索不方便
3)queue
先进的先出
4)stack
后进的先出
三、列表查询
- index(value,[start,[stop]])
通过值value,从指定区间找到列表内的元素是否匹配
匹配第一个就立即返回索引
匹配不到,抛出异常ValueError
举例:
In [117]: lst=[1,2,4]
In [118]: lst
Out[118]: [1, 2, 4]
In [119]: lst.index(4)
Out[119]: 2
- count(value)
返回列表中匹配value的次数
举例:
In [124]: lst=[1,2,3,4,3,5]
In [125]: lst
Out[125]: [1, 2, 3, 4, 3, 5]
In [126]: lst.count(3)
Out[126]: 2
- 时间复杂度
index和count方法都是O(n)
随着列表数据规模的增大,而效率下降
如何返回列表元素的个数?如何遍历?如何设计高效?
len()
举例:
In [124]: lst=[1,2,3,4,3,5]
In [125]: lst
Out[125]: [1, 2, 3, 4, 3, 5]
In [128]: len(lst)
Out[128]: 6
In [129]: for i in lst:
...: print(i)
...:
1
2
3
4
3
5
四、如何查帮助
- 官方帮助文档
搜索关键字 - ipython中
help(keyword)
keyword可以是变量、对象、类名、函数名、方法名
五、列表元素修改
索引访问修改
list[index] = value
索引不要超界
举例:
In [130]: lst=['a','c','d']
In [131]: lst
Out[131]: ['a', 'c', 'd']
In [132]: lst[1] = 1
In [133]: lst
Out[133]: ['a', 1, 'd']
六、列表增加、插入元素
- append(object)->None
列表尾部追加元素,返回None
返回None就意味着没有新的列表产生,就地修改
时间复杂度是O(1)
举例:
In [134]: lst
Out[134]: ['a', 1, 'd']
In [136]: lst.append(1)
In [137]: lst
Out[137]: ['a', 1, 'd', 1]
- insert(index,object)->None
在指定的索引index处插入元素object
返回None就意味着没有新的列表产生,就地修改
时间复杂度是O(n)
索引能超上下界吗?
超越上界,尾部追加
超越下界,头部追加
举例:
In [137]: lst
Out[137]: ['a', 1, 'd', 1]
In [138]: lst.insert(2,'def')
In [139]: lst
Out[139]: ['a', 1, 'def', 'd', 1]
- extend(iteratable)->None
将可迭代对象的元素追加进来,返回None
就地修改
举例:
In [140]: lst
Out[140]: ['a', 1, 'def', 'd', 1]
In [142]: lst.extend([1,2,3])
In [143]: lst
Out[143]: ['a', 1, 'def', 'd', 1, 1, 2, 3]
In [144]: lst.extend('ddddd')
In [145]: lst
Out[145]: ['a', 1, 'def', 'd', 1, 1, 2, 3, 'd', 'd', 'd', 'd', 'd']
- + -> list
连接操作,将两个列表连接起来
产生新的列表,原列表不变
本质上调用的是魔术方法__add__()方法
举例:
In [148]: lst=[1,2]
In [149]: l2st=['a','b']
In [150]: l3st=lst + l2st
In [151]: l3st
Out[151]: [1, 2, 'a', 'b']
- * -> list
重复操作,将本列表元素重复n次,返回新的列表
1)正常列表重复操作
In [154]: lst
Out[154]: [1, 2]
In [155]: l2st = lst * 3
In [156]: l2st
Out[156]: [1, 2, 1, 2, 1, 2]
In [157]: l2st[1] = 'a'
In [158]: l2st
Out[158]: [1, 'a', 1, 2, 1, 2]
In [159]: lst
Out[159]: [1, 2]
2)嵌套列表操作
In [165]: lst
Out[165]: [[1, 2, 3]]
In [166]: lst=[[1,2,3]]
In [167]: l2st = lst * 3
In [168]: l2st
Out[168]: [[1, 2, 3], [1, 2, 3], [1, 2, 3]]
In [169]: l2st[1][1]='a'
In [170]: l2st
Out[170]: [[1, 'a', 3], [1, 'a', 3], [1, 'a', 3]]
In [171]: lst
Out[171]: [[1, 'a', 3]]
七、列表删除元素
- remove(value) -> None
从左至右查找第一个匹配value的值,移除该元素,返回None,就地修改
效率:O(n)
举例:
In [173]: lst=[1,2,1,3]
In [174]: lst
Out[174]: [1, 2, 1, 3]
In [175]: lst.remove(1)
In [176]: lst
Out[176]: [2, 1, 3]
- pop([index]) -> item
不指定索引index,就从列表尾部弹出一个元素
指定索引index,就从索引出弹出一个元素,索引超界抛出IndexError错误
效率?指定索引的时间复杂度?不指定索引呢?
举例:
In [177]: lst=[1,2,1,3]
In [179]: lst.pop(3)
Out[179]: 3
In [180]: lst
Out[180]: [1, 2, 1]
- clear() -> None
清除列表所有元素,剩下一个空列表
举例:
In [181]: lst
Out[181]: [1, 2, 1]
In [182]: lst.clear()
In [183]: lst
Out[183]: []
八、列表其他操作
- reverse() -> None
将列表元素反转,返回None
就地修改
举例:
In [185]: lst=[1,2,3,4,'a','b','c']
In [186]: lst
Out[186]: [1, 2, 3, 4, 'a', 'b', 'c']
In [187]: lst.reverse()
In [188]: lst
Out[188]: ['c', 'b', 'a', 4, 3, 2, 1]
- sort(key=None,reverse=False) -> None
对列表元素进行排序,就地修改,默认升序
reverse为True,反转,降序
key一个函数,指定key如何排序
lst.sort(key=function)
举例:
In [203]: lst=[1,2,3,4,'7','6']
In [204]: lst
Out[204]: [1, 2, 3, 4, '7', '6']
In [205]: lst.sort(key=int)
In [206]: lst
Out[206]: [1, 2, 3, 4, '6', '7']
In [207]: lst.sort(key=int,reverse=True)
In [208]: lst
Out[208]: ['7', '6', 4, 3, 2, 1]
- in
[3,4] in [1,2,[3,4]]
for x in [1,2,3,4]
九、列表复制
- shadow copy
影子拷贝,也叫浅拷贝,遇到引用类型,只是复制一个引用而已
举例:
In [165]: lst
Out[165]: [[1, 2, 3]]
In [166]: lst=[[1,2,3]]
In [167]: l2st = lst * 3
In [168]: l2st
Out[168]: [[1, 2, 3], [1, 2, 3], [1, 2, 3]]
In [169]: l2st[1][1]='a'
In [170]: l2st
Out[170]: [[1, 'a', 3], [1, 'a', 3], [1, 'a', 3]]
In [171]: lst
Out[171]: [[1, 'a', 3]]
- 深拷贝
copy模块提供了deepcopy,拷贝以后两个列表互不影响
举例:
In [226]: import copy
In [227]: lst = [1,2,3,['a','b']]
In [228]: lst
Out[228]: [1, 2, 3, ['a', 'b']]
In [229]: l2st = copy.deepcopy(lst)
In [230]: l2st
Out[230]: [1, 2, 3, ['a', 'b']]
In [232]: l2st[3][1] = 1
In [233]: l2st
Out[233]: [1, 2, 3, ['a', 1]]
In [234]: lst
Out[234]: [1, 2, 3, ['a', 'b']]
十、随机数
- random模块
举例:
import random
- randint(a,b)返回[a,b]之间的整数
举例:
In [8]: random.randint(1,3)
Out[8]: 1
In [9]: random.randint(1,3)
Out[9]: 2
In [10]: random.randint(1,3)
Out[10]: 3
- choice(seq)从非空序列的元素中随机挑选一个元素,比如random.choice(range(10)),从0到9中随机挑选一个整数。random.choice[1,3,5,7]
举例:
In [11]: random.choice(range(10))
Out[11]: 5
In [12]: random.choice(range(10))
Out[12]: 1
In [13]: random.choice(range(10))
Out[13]: 1
In [14]: random.choice(range(10))
Out[14]: 4
In [15]: random.choice(range(10))
Out[15]: 9
In [17]: random.choice([1,2,3,5,7,9])
Out[17]: 2
In [18]: random.choice([1,2,3,5,7,9])
Out[18]: 1
In [19]: random.choice([1,2,3,5,7,9])
Out[19]: 5
- randrange([start,] stop [,step])从指定范围内,按指定基数递增的集合中获取一个随机数,基数缺省值为1。random.randrange(1,7,2)
举例:
In [24]: random.randrange(1,10,2)
Out[24]: 1
In [25]: random.randrange(1,10,2)
Out[25]: 5
In [26]: random.randrange(1,10,2)
Out[26]: 7
In [27]: random.randrange(1,10,2)
Out[27]: 9
In [28]: random.randrange(1,10,2)
Out[28]: 3
- random.shuffle(list) -> None就地打乱列表元素
举例:
In [29]: lst = [1,'a','b',2,3,'c']
In [30]: lst
Out[30]: [1, 'a', 'b', 2, 3, 'c']
In [31]: random.shuffle(lst)
In [32]: lst
Out[32]: [1, 3, 2, 'c', 'a', 'b']
- sample(population,k)从样本空间或总体(序列或者集合类型)中随机取出k个
不同的元素
,返回一个新的列表
举例:
1)random.sample([‘a’,‘b’,‘c’,‘d’],2)
In [32]: lst
Out[32]: [1, 3, 2, 'c', 'a',
In [34]: random.sample(lst,2)
Out[34]: ['a', 'b']
In [35]: random.sample(lst,2)
Out[35]: ['a', 'c']
In [36]: random.sample(lst,2)
Out[36]: ['a', 'b']
In [37]: random.sample(lst,2)
Out[37]: ['c', 'a']
2)random.sample([‘a’,‘a’],2)会返回什么结果
In [43]: random.sample(['a','a'],2)
Out[43]: ['a', 'a']
In [44]: random.sample([1,1],2)
Out[44]: [1, 1]