列表 []


一、关于列表

列表对象的本质是一个有序的、可迭代、可切片、可变的序列,内部元素支持任意对象。

是写在方括号 [] 之间、用逗号分隔开的元素列表。

# 声明一个列表对象的变量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 list
list(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循环其实可以同时使用两个甚至多个变量,比如dictitems()可以同时迭代key和value:

>>> d = {'x': 'A', 'y': 'B', 'z': 'C' }
>>> for k, v in d.items():
...     print(k, '=', v)
...
y = B
x = A
z = 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)   # range
print(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)
... 
0
1
4
...

使用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 l
False

由于列表对象为可变对象, + = / * = 操作的本质为向变量指向的原内存空间添加新的对象,所以指向的内存地址不变


列表运算符

列表对 + 和 * 的操作符与字符串相似。+ 号用于组合列表,* 号用于重复列表。

操作符 描述
+ 组合
* 重复
[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 arrival
deque(['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]]


posted @ 2021-02-04 11:00  月思  阅读(72)  评论(0编辑  收藏  举报