python学习笔记17:列表list
1. 常用操作
注: 可以通过help(list)获取list的完整知识;
常用方法
函数名 | 用法 | 说明 |
---|---|---|
append | lst.append(item) | 列表末尾添加一个元素 |
extend | lst.extend(lst_new) | 列表末尾添加lst_new的元素 |
insert | lst.insert(i, item) | 在位置i添加元素item |
pop | lst.pop(i) | 删除并返回位置i的元素, i默认为最后一项,也可以使用del lst[i] |
sort | lst.sort() | 对lst进行排序, 会更改lst, 不返回lst |
reverse | lst.reverse() | lst逆序, 会更改lst, 不返回lst |
index | lst.index(item) | 返回lst中第一次出现item的idx |
count | lst.count(item) | 返回lst中value==item的个数 |
remove | lst.remove(item) | 删除lst中第一个value==item的元素, 不返回值 |
len | len(lst) | 返回元素个数/lst的长度 |
具体使用示例
列表清空/列表赋值
>>> abc = [] #清空列表(把空列表赋值给变量):
>>> shoplist = [‘apple’, ‘mango’, ‘carrot’, ‘banana’] # 赋值多个元素
列表遍历
>>> for ele in shoplist:
... print(ele)
>>> for i, ele in enumerate(shoplist): 遍历时同时给元素编号/获取索引值
... print(f'{i} {ele}')
列表长度(元素个数)
>>> len(shoplist)
4
列表追加列表/列表合并/列表排序
>>> L1.extend(L2) # 在列表L1结尾追加列表L2中的元素;
>>> L3 = L1 + L2 # 列表合并;
>>> L1.sort() # 列表排序,注意,列表本身会改变,而不是返回一个被改变的列表,因为列表是可变的。该语句返回None;sort()详细使用见第15.9节;
获取指定idx对应的元素/获取指定元素对应的idx
>>> shoplist[0] #根据下标获取列表元素, 返回元素:
‘apple’
>>>
>>> #取元素对应的index:
>>> shoplist.index(‘apple’) #根据列表元素获取下标, 返回下标, 如果元素不存在, 则raise ValueError
0
列表追加元素
>>> shoplist.append(‘rice’) # 给列表追加元素,返回None
>>> shoplist
[‘apple’, ‘mango’, ‘carrot’, ‘banana’, ‘rice’]
指定idx添加元素
>>> shoplist.insert(2, ‘cup’) # 指定index添加元素,返回None
>>> shoplist # cup成为idx=2的元素,原本idx>=2的元素的idx都增加1
[‘apple’, ‘mango’, ‘cup’, ‘carrot’, ‘banana’, ‘rice’]
指定idx删除元素
>>> ele = shoplist.pop(2) # 指定index删除元素,返回元素, 默认删除最后一项;
>>> ele
‘cup’
>>> shoplist
[‘apple’, ‘mango’, ‘carrot’, ‘banana’, ‘rice’]
>>>
>>> ele = shoplist.pop() #不指定idx,则删除末尾元素
>>> ele
‘rice’
>>> shoplist
[‘apple’, ‘mango’, ‘carrot’, ‘banana’]
指定value删除元素
>>> lst = list('hello world')
>>> lst
['h', 'e', 'l', 'l', 'o', ' ', 'w', 'o', 'r', 'l', 'd']
>>> lst.remove('o') # 删除第一个出现的'o'
>>> lst
['h', 'e', 'l', 'l', ' ', 'w', 'o', 'r', 'l', 'd']
计算某元素出现的次数
>>> shoplist.count(‘carrot’) # 返回int,如果元素不存在,则返回0;
1
遍历list时对循环变量赋值不会改变原本的list.
>>> a = [0, 1, 2, 3, 4]
>>> for e in a:
... e = 5 # 直接给元素变量赋值不会改变list本身(与Perl有区别)
...
>>> print(a) # [0, 1, 2, 3, 4],遍历list元素并对元素赋值不会改变list。
2. 列表生成式
列表生成式用来简洁在创建一个列表或从一个列表导出另一个列表;
>>> list(range(1,11)) # 生成从1到10组成的列表
>>> [x**2 for x in range(1,11)] # 生成从1到10的平方组成的列表
>>> [x**2 for x in range(1,11) if x%2==0] # 生成从1到10的中的偶数的平方组成的列表;
>>> [m+n for m in ‘ABC’ for n in ‘XYZ’]# 两层循环,生成ABC与XYZ字符的排列
>>> [d for d in os.listdir(‘.’)] # 列表当前目录下的所有文件和文件夹
>>> [k+‘=’+v for k,v in d.items()] # for循环使用两个变量,把k和v用等号连接
>>> [s.lower() for s in L] # 把list中的字符串改成小写;
3. 生成器
3.1. 使用类似列表生成式的for循环实现generator
列表容量有限,一边循环一边计算生成列表,这种方式叫:generator;
>>> L = [x**2 for x in range(10)] # 列表生成式;打印L可以打印出所有元素;
>>> g = (x**2 for x in range(10)) # generator;与列表生成式的区别是小括号;
>>> g #打印g会得到,这个地方保存的是算法,而不是实际的列表;
<generator object <genexpr> at 0x1022ef630>
多次使用next(g)可以依次取出值,但比较傻;
generater是可迭代对象,所以可以使用循环:
>>> for n in g:
... print(n, end=’ ’)
...
0 1 4 9 16 25 36 49 64 81
g循环过一次后,再对g做循操作,g里面就没有内容了;
3.2. 使用函数实现generator: yield
如果一个函数定义中包含yield关键字,则函数就不再是一个普通函数,而是一个generator.
斐波拉契数列:
>>> def fib(max):
... a, b = 0, 1
... for i in range(max):
... yield b # 每次调用next或每次循环,执行到这就会暂停,返回这个值;
... a, b = b, a+b
... return ‘Done’ # generator的return值需要通过捕获StopIteration拿到;
...
>>> f = fib(6)
>>> f
<generator object fib at ox2ac****>
>>> for i in f:
... print(i, end=‘ ’)
...
1 1 2 3 5 8
4. 迭代器
可以被next()函数调用并不断返回下一个值的对象称为迭代器:Iterator;
生成器都是Iterator对象,但list、dict、str虽然Iterable,但不是Iterator;
import collections
isinstance(100, collections.Iterable) # False,整数不是可迭代的
isinstance([], collections.Iterable) # True , 列表是可迭代的;
isinstance([], collections.Iterator) # False,列表不是迭代器;
_gen = (x for x in range(10))
isinstance(_gen, collections.Iterable) # True,generator是可迭代的;
isinstance(_gen, collections.Iterator) # True,generator是迭代器;
使用iter()函数,可以把list/dict/str变成Iterator;
isinstance(iter([]), collections.Iterator) # True