列表 []
一、关于列表
列表对象的本质是一个有序的、可迭代、可切片、可变的序列,内部元素支持任意对象。
是写在方括号 [] 之间、用逗号分隔开的元素列表。
# 声明一个列表对象的变量l>>> l = ['l', 'i', 'm', 'a', 'n', 'm', 'a', 'n']>>> type(l)<type 'list'># 查看list类型的定义>>> help(list)# 查看list类型的属性和方法>>> dir(list)# 让Python2中也可以兼容Python3的print函数用法>>> from __future__ import print_function
二、对象创建 & 赋值
赋值运算:向内存申请一空闲内存单元存储列表,然后将变量名指向此内存单元首地址,就可通过变量名操作此内存单元数据。
>>> l = ['5', '2', '1']
# 方式1: 通过字面量形式创建>>> l = ['5', '2', '1']# 方式2: 通过类型创建"""list() -> new empty listlist(iterable) -> new list initialized from iterable's items""">>> l = list('521')['5', '2', '1']
[] 空列表
>>> list()[]
列表推导式
英文全称:List Comprehensions。
列表推导式提供了从 序列
创建列表的简单途径。
>>> vec = [2, 4, 6]>>> [3*x for x in vec][6, 12, 18]>>> [[x, x**2] for x in vec][[2, 4], [4, 16], [6, 36]]
方法调用
# 这里调用 .strip() 方法去除前后空格>>> freshfruit = [' banana', ' loganberry ', 'passion fruit ']>>> [weapon.strip() for weapon in freshfruit]['banana', 'loganberry', 'passion fruit']# 使用 .lower() 将内容改为小写>>> L = ['Hello', 'World', 'IBM', 'Apple']>>> [s.lower() for s in L]['hello', 'world', 'ibm', 'apple']# 使用复杂表达式或嵌套函数>>> [str(round(355/113, i)) for i in range(1, 6)]['3.1', '3.14', '3.142', '3.1416', '3.14159']
条件过滤
>>> [3*x for x in vec if x > 3][12, 18]>>> [3*x for x in vec if x < 2][]
以下是一些关于循环
和其它技巧的演示:
>>> [m n for m in 'ABC' for n in 'XYZ']['AX', 'AY', 'AZ', 'BX', 'BY', 'BZ', 'CX', 'CY', 'CZ']>>> vec1 = [2, 4, 6]>>> vec2 = [4, 3, -9]>>> [x*y for x in vec1 for y in vec2][8, 6, -18, 16, 12, -36, 24, 18, -54]>>> [x y for x in vec1 for y in vec2][6, 5, -7, 8, 7, -5, 10, 9, -3]>>> [vec1[i]*vec2[i] for i in range(len(vec1))][8, 12, -54]
用两个变量来生成 list
for
循环其实可以同时使用两个甚至多个变量,比如dict
的items()
可以同时迭代key和value:
>>> d = {'x': 'A', 'y': 'B', 'z': 'C' }>>> for k, v in d.items():... print(k, '=', v)...y = Bx = Az = C
因此,列表生成式也可以使用两个变量来生成list:
>>> d = {'x': 'A', 'y': 'B', 'z': 'C' }>>> [k '=' v for k, v in d.items()]['y=B', 'x=A', 'z=C']
使用 range
set[x:y:z]
是一个完整的函数
a = range(0,5)type(a) # rangeprint(a) # range(0, 3) >>> l = list(range(5))[0, 1, 2, 3, 4]>>> [x * x for x in range(1, 11)][1, 4, 9, 16, 25, 36, 49, 64, 81, 100]>>> [x * x for x in range(1, 11) if x % 2 == 0][4, 16, 36, 64, 100]
字符串和列表
>>> s = '123'>>> s[::-1] # 字符串反向遍历'321'>>> s # 不会改变原来的值'123'>>> list(s)['1', '2', '3']>>> list(s)[::1]['1', '2', '3']>>> ''.join(list(s)[::1])'123'# 使用列表的 reverse 方法>>> a = list(s)>>> a['1', '2', '3']>>> a.reverse()>>> a['3', '2', '1']
应用
列出目录名:列出当前目录下的所有文件和目录名,可以通过一行代码实现:
>>> import os # 导入os模块,模块的概念后面讲到>>> [d for d in os.listdir('.')] # os.listdir可以列出文件和目录['.ssh', '.Trash', 'Adlm', 'Applications', 'Desktop', 'Documents', 'Downloads', 'Library', 'Movies', 'Music', 'Pictures', 'Public', 'VirtualBox VMs', 'Workspace']
属性
>>>len([1, 2, 3])3>>> max(['d', '2', 'a']) 'd'>>> max(['d', '2', 'ag'])'d'
查找遍历
索引
>>> a=['Google', 'Runoob', 'Taobao']>>> a[2]'Taobao'>>> a[-2]'Runoob'>>> a[1:]['Runoob', 'Taobao']
使用for循环遍历
>>> g = (x * x for x in range(10))>>> for n in g:... print(n)... 014...
使用next()
遍历
>>> next(g)0>>> next(g)1>>> next(g)4...>>> next(g)81>>> next(g)Traceback (most recent call last): File "<stdin>", line 1, in <module>StopIteration
in/not in 是否存在
>>>3 in [1, 2, 3]True>>> for x in [1, 2, 3]: print(x, end=" ")
增加 & 删除
append 添加 & pop 删除
列表是可变的:可以不改变物理地址指向的前提下,实现原地修改。方法:append,pop。
# 添加对象到最后>>> l.append('!')>>> l['a', 'b', 'c', 'd', '!']>>> id(l)140550742839456# 从列表中删除指定索引位置的对象,L.pop([index]) -> item,默认index的值为-1>>> l.pop(-1)'!'>>> l['a', 'b', 'c', 'd']>>> id(l)140550742839456
>>> l = ['5', '2', '1']# .append(object)>>> l.append('!')>>> l['5', '2', '1', '!']# .count(value)>>> l.count('!')1>>> l.count('?')0# .extend(iterable)>>> l.extend('1314') # 自动切割了元素>>> l['5', '2', '1', '!', '1', '3', '1', '4']# .index(value, [start, [stop]]) # 查找值出现在了哪个位置>>> l.index('!')3>>> l.index('?')Traceback (most recent call last): File "<stdin>", line 1, in <module>ValueError: '?' is not in list # .insert(index, object)>>> l.insert(len(l), '?')>>> l['5', '2', '1', '!', '1', '3', '1', '4', '?']# .pop([index])>>> l.pop(-1)'?'>>> l.pop(len(l))Traceback (most recent call last): File "<stdin>", line 1, in <module>IndexError: pop index out of range>>> l['5', '2', '1', '!', '1', '3', '1', '4']
# .remove(value)>>> l.remove('!')>>> l.remove('?')Traceback (most recent call last): File "<stdin>", line 1, in <module>ValueError: list.remove(x): x not in list>>> l['5', '2', '1', '1', '3', '1', '4'] # .reverse()>>> l.reverse()>>> l['4', '1', '3', '1', '1', '2', '5']# .sort(cmp=None, key=None, reverse=False)>>> l.sort(key=lambda i: i, reverse=True)>>> l['5', '4', '3', '2', '1', '1', '1']>>> l = ['5', '2', '1', '1', '3', '1', '4'] >>> 'x' in l and l.remove('x') # 加上这个判断,删除不存在的就不会报错False>>> '1' in l and l.remove('1') # 只删除第一次找到的>>> l['5', '2', '1', '3', '1', '4']
del 删除
使用 del 语句可以从一个列表中依索引而不是值来删除一个元素。这与使用 pop() 返回一个值不同。
可以用 del 语句从列表中删除一个切割,或清空整个列表(我们以前介绍的方法是给该切割赋一个空列表)。例如:
#!/usr/bin/python3 list = ['Google', 'Runoob', 1997, 2000] print("原始列表 : ", list)del list[2]print("删除第三个元素 : ", list)
以上实例输出结果:
原始列表 : ['Google', 'Runoob', 1997, 2000]删除第三个元素 : ['Google', 'Runoob', 2000]
>>> a = [1, 2, 3, 4, 5, 6]>>> del a[0]>>> a[2, 3, 4, 5, 6]>>> a = [1, 2, 3, 4, 5, 6]>>> del a[2:4]>>> a[1, 2, 5, 6]# 删除全部>>> del a[:]>>> a[]
也可以用 del 删除实体变量:
>>> del a
运算
身份运算 is & ==
常用于比较两个对象是否指向同一个 内存单元
is 比较地址,== 比较数值
>>> l is ['5', '2', '1']False>>> l = ['5', '2', '1']>>> l == ['5', '2', '1']True
数学运算
结果总是隐式转换为复杂类型
# 加法,可结合赋值运算 =>>>[1, 2, 3] [4, 5, 6] [1, 2, 3, 4, 5, 6]>>> l = [1, 2, 3]>>> l = [4, 5, 6] >>> l[1, 2, 3, 4, 5, 6]# 乘法,可结合赋值运算*=>>> l * 2[1, 2, 3, 1, 2, 3]>>>['Hi!'] * 4 ['Hi!', 'Hi!', 'Hi!', 'Hi!']
逻辑运算
# 与, 都为真为真>>> [] and l[]# 或, 一个真即真>>> [] or l['5', '2', '1']# 非,总是隐式转换为布尔对象>>> not lFalse
由于列表对象为可变对象, = / * = 操作的本质为向变量指向的原内存空间添加新的对象,所以指向的内存地址不变
列表运算符
列表对 和 * 的操作符与字符串相似。 号用于组合列表,* 号用于重复列表。
操作符 | 描述 |
---|---|
组合 | |
* | 重复 |
[num] |
索引 |
[:] | 截取 |
in | 元素是否存在于列表中 |
not in |
函数
1、Python 内置函数
函数 | 说明 |
---|---|
len(list) | 列表元素个数 |
max(list) | 返回列表元素最大值 |
min(list) | 返回列表元素最小值 |
list(seq) | 将元组转换为列表 |
2、列表自身方法
.
开头是列表自身方法,非内置方法。方法中 方括号[] 表示这个参数是可选的,而不是要求你输入一对方括号,你会经常在 Python 库参考手册中遇到这样的标记。
方法 | 描述 | |
---|---|---|
l.append(x) | 把一个元素添加到列表的结尾,相当于 a[len(a):] = [x]。 | |
l.extend(l1) | 通过添加指定列表的所有元素来扩充列表,相当于 a[len(a):] = l1。 | |
l.insert(i, x) | 在指定位置插入一个元素,原地修改。 | |
第一个参数是准备插入到其前面的那个元素的索引,例如 a.insert(0, x) 会插入到整个列表之前,而 a.insert(len(a), x) 相当于 a.append(x) 。 | ||
l.remove(x) | 删除列表中值为 x 的第一个元素,原地修改。如果没有这样的元素,就会返回 ValueError错误。 | |
l.pop([i]) | 从列表的指定位置移除元素,并将其返回。 | |
索引超出则抛出IndexError异常,index默认为-1( 索引超出则抛出IndexError异常,index默认为-1) | ||
l.clear() | 移除列表中的所有项,等于del a[:]。 | |
l.index(value, [start, [stop]]) | 计算从start到stop中间value在列表中的索引值并返回,不存在抛出ValueError异常 | |
l.count(x) | 返回 x 在列表中出现的次数。 | |
l.sort(cmp=None, key=None, reverse=False) |
将列表按照key对应的函数排序,reverse是否倒序,原地修改 | |
l.reverse() | 将列表的元素倒序,原地修改 | |
l.copy() | 浅复制 ,等于a[:]。 |
|
l.index(value, [start, [stop]]) | 计算从start到stop中间value在列表中的索引值并返回,不存在抛出ValueError异常 | |
l.insert(index, object) | 将object插入列表中索引为index的位置, |
将列表当做堆栈使用
append、pop
列表方法使得列表可以很方便的作为一个堆栈来使用,堆栈作为特定的数据结构,最先进入的元素最后一个被释放(后进先出)。用 append() 方法可以把一个元素添加到堆栈顶。用不指定索引的 pop() 方法可以把一个元素从堆栈顶释放出来。
将列表当作队列使用
append、popleft
也可以把列表当做队列用,只是在队列里第一加入的元素,第一个取出来;但是拿列表用作这样的目的效率不高。在列表的最后添加或者弹出元素速度快,然而在列表里插入或者从头部弹出速度却不快(因为所有其他的元素都得一个一个地移动)。
>>> from collections import deque>>> queue = deque(["Eric", "John", "Michael"])>>> queue.append("Terry") # Terry arrives>>> queue.append("Graham") # Graham arrives>>> queue.popleft() # The first to arrive now leaves'Eric'>>> queue.popleft() # The second to arrive now leaves'John'>>> queue # Remaining queue in order of arrivaldeque(['Michael', 'Terry', 'Graham'])
嵌套列表
以下实例展示了3X4的矩阵列表:
>>> matrix = [... [1, 2, 3, 4],... [5, 6, 7, 8],... [9, 10, 11, 12],... ]
以下实例将 3X4 的矩阵列表转换为 4X3 列表:
>>> [[row[i] for row in matrix] for i in range(4)][[1, 5, 9], [2, 6, 10], [3, 7, 11], [4, 8, 12]]
以下实例也可以使用以下方法来实现:
>>> transposed = []>>> for i in range(4):... transposed.append([row[i] for row in matrix])...>>> transposed[[1, 5, 9], [2, 6, 10], [3, 7, 11], [4, 8, 12]]
另外一种实现方法:
>>> transposed = []>>> for i in range(4):... # the following 3 lines implement the nested listcomp... transposed_row = []... for row in matrix:... transposed_row.append(row[i])... transposed.append(transposed_row)...>>> transposed[[1, 5, 9], [2, 6, 10], [3, 7, 11], [4, 8, 12]]
来源:https://www.icode9.com/content-4-845501.html