序列是 Python 中最基本的数据结构。 序列中的每个值都有对应的位置值,称之为索引,第一个索引是 0,第二个索引是 1,依此类推。 Python 有 6 个序列的内置类型,但最常见的是列表和元组。 列表都可以进行的操作包括索引,切片,加,乘,检查成员。 此外,Python 已经内置确定序列的长度以及确定最大和最小的元素的方法。 列表是最常用的 Python 数据类型,它可以作为一个方括号内的逗号分隔值出现。 列表的数据项不需要具有相同的类型

创建一个列表,只要把逗号分隔的不同的数据项使用方括号括起来即可。如下所示:

  1. list1 = ['Google', 'Runoob', 1997, 2000]
  2. list2 = [1, 2, 3, 4, 5 ]
  3. list3 = ["a", "b", "c", "d"]
  4. list4 = ['red', 'green', 'blue', 'yellow', 'white', 'black']

访问列表中的值

与字符串的索引一样,列表索引从 0 开始,第二个索引是 1,依此类推。
通过索引列表可以进行截取、组合等操作。
Python3 列表 - 图1

  1. #!/usr/bin/python3
  2. list = ['red', 'green', 'blue', 'yellow', 'white', 'black']
  3. print( list[0] )
  4. print( list[1] )
  5. print( list[2] )
  6. """
  7. red
  8. green
  9. blue
  10. """

索引也可以从尾部开始,最后一个元素的索引为 -1,往前一位为 -2,以此类推。
Python3 列表 - 图2

  1. #!/usr/bin/python3
  2. list = ['red', 'green', 'blue', 'yellow', 'white', 'black']
  3. print( list[-1] )
  4. print( list[-2] )
  5. print( list[-3] )
  6. print( list[:-3:2] )
  7. """
  8. black
  9. white
  10. yellow
  11. ['red', 'blue']
  12. """

使用下标索引来访问列表中的值,同样你也可以使用方括号 [] 的形式截取字符,如下所示:
Python3 列表 - 图3

  1. #!/usr/bin/python3
  2. nums = [10, 20, 30, 40, 50, 60, 70, 80, 90]
  3. print(nums[0:4])
  4. """
  5. [10, 20, 30, 40]
  6. """

使用负数索引值截取:

  1. #!/usr/bin/python3
  2. list = ['Google', 'Runoob', "Zhihu", "Taobao", "Wiki"]
  3. # 读取第二位
  4. print ("list[1]: ", list[1])
  5. # 从第二位开始(包含)截取到倒数第二位(不包含)
  6. print ("list[1:-2]: ", list[1:-2])
  7. """
  8. list[1]: Runoob
  9. list[1:-2]: ['Runoob', 'Zhihu']
  10. """

更新列表

你可以对列表的数据项进行修改或更新,你也可以使用 append() 方法来添加列表项,如下所示:

  1. #!/usr/bin/python3
  2. list = ['Google', 'Runoob', 1997, 2000]
  3. print ("第三个元素为 : ", list[2])
  4. list[2] = 2001
  5. print ("更新后的第三个元素为 : ", list[2])
  6. list1 = ['Google', 'Runoob', 'Taobao']
  7. list1.append('Baidu')
  8. print ("更新后的列表 : ", list1)
  9. """
  10. 第三个元素为 : 1997
  11. 更新后的第三个元素为 : 2001
  12. 更新后的列表 : ['Google', 'Runoob', 'Taobao', 'Baidu']
  13. """

删除列表元素

使用 del 语句可以从一个列表中依索引而不是值来删除一个元素。这与使用 pop() 返回一个值不同。可以用 del 语句从列表中删除一个切割,或清空整个列表(我们以前介绍的方法是给该切割赋一个空列表)。例如:

  1. #!/usr/bin/python3
  2. list = ['Google', 'Runoob', 1997, 2000]
  3. print ("原始列表 : ", list)
  4. del list[1]
  5. print ("删除第二个元素 : ", list)
  6. """
  7. 原始列表 : ['Google', 'Runoob', 1997, 2000]
  8. 删除第二个元素 : ['Google', 1997, 2000]
  9. """
  1. >>> a = [-1, 1, 66.25, 333, 333, 1234.5]
  2. >>> del a[0]
  3. >>> a
  4. [1, 66.25, 333, 333, 1234.5]
  5. >>> del a[2:4]
  6. >>> a
  7. [1, 66.25, 1234.5]
  8. >>> del a[:]
  9. >>> a
  10. []

也可以用 del 删除实体变量:

  1. >>> del a

使用 remove() 方法移除元素

  1. #!/usr/bin/python3
  2. list = ['Google', 'Runoob', 1997, 2000]
  3. print ("原始列表 : ", list)
  4. list.remove("Runoob")
  5. print ("移除之后的列表 : ", list)
  6. """
  7. 原始列表 : ['Google', 'Runoob', 1997, 2000]
  8. 移除之后的列表 : ['Google', 1997, 2000]
  9. """

Python列表脚本操作符

列表对 + 和 的操作符与字符串相似。+ 号用于组合列表, 号用于重复列表。
如下所示:

Python 表达式 结果 描述
len([1, 2, 3]) 3 长度
[1, 2, 3] + [4, 5, 6] [1, 2, 3, 4, 5, 6] 组合
[‘Hi!’] * 4 [‘Hi!’, ‘Hi!’, ‘Hi!’, ‘Hi!’] 重复
3 in [1, 2, 3] True 元素是否存在于列表中
for x in [1, 2, 3]: print(x, end=” “) 1 2 3 迭代

Python列表截取与拼接

Python的列表截取与字符串操作类型,如下所示:

  1. L=['Google', 'Runoob', 'Taobao']
Python 表达式 结果 描述
L[2] ‘Taobao’ 读取第三个元素
L[-2] ‘Runoob’ 从右侧开始读取倒数第二个元素: count from the right
L[1:] [‘Runoob’, ‘Taobao’] 输出从第二个元素开始后的所有元素
  1. >>>L=['Google', 'Runoob', 'Taobao']
  2. >>> L[2]
  3. 'Taobao'
  4. >>> L[-2]
  5. 'Runoob'
  6. >>> L[1:]
  7. ['Runoob', 'Taobao']
  8. >>>

列表还支持拼接操作:

  1. >>>squares = [1, 4, 9, 16, 25]
  2. >>> squares += [36, 49, 64, 81, 100]
  3. >>> squares
  4. [1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
  5. >>>

嵌套列表

使用嵌套列表即在列表里创建其它列表,例如:

  1. >>>a = ['a', 'b', 'c']
  2. >>> n = [1, 2, 3]
  3. >>> x = [a, n]
  4. >>> x
  5. [['a', 'b', 'c'], [1, 2, 3]]
  6. >>> x[0]
  7. ['a', 'b', 'c']
  8. >>> x[0][1]
  9. 'b'

以下实例展示了3X4的矩阵列表:

  1. >>> matrix = [
  2. ... [1, 2, 3, 4],
  3. ... [5, 6, 7, 8],
  4. ... [9, 10, 11, 12],
  5. ... ]

以下实例将3X4的矩阵列表转换为4X3列表:

  1. >>> [[row[i] for row in matrix] for i in range(4)]
  2. [[1, 5, 9], [2, 6, 10], [3, 7, 11], [4, 8, 12]]

以下实例也可以使用以下方法来实现:

  1. >>> transposed = []
  2. >>> for i in range(4):
  3. ... transposed.append([row[i] for row in matrix])
  4. ...
  5. >>> transposed
  6. [[1, 5, 9], [2, 6, 10], [3, 7, 11], [4, 8, 12]]

另外一种实现方法:

  1. >>> transposed = []
  2. >>> for i in range(4):
  3. ... # the following 3 lines implement the nested listcomp
  4. ... transposed_row = []
  5. ... for row in matrix:
  6. ... transposed_row.append(row[i])
  7. ... transposed.append(transposed_row)
  8. ...
  9. >>> transposed
  10. [[1, 5, 9], [2, 6, 10], [3, 7, 11], [4, 8, 12]]

遍历

在序列中遍历时,索引位置和对应值可以使用 enumerate() 函数同时得到:

  1. for v in ['tic', 'tac', 'toe']:
  2. print(v)
  3. """
  4. tic
  5. tac
  6. toe
  7. """
  8. for i, v in enumerate(['tic', 'tac', 'toe']):
  9. print(i, v)
  10. """
  11. 0 tic
  12. 1 tac
  13. 2 toe
  14. """

同时遍历两个或更多的序列,可以使用 zip() 组合:

  1. questions = ['name', 'quest', 'favorite color']
  2. answers = ['lancelot', 'the holy grail', 'blue']
  3. for q, a in zip(questions, answers):
  4. print('What is your {0}? It is {1}.'.format(q, a))
  5. print("-"*50)
  6. for q, a in zip(questions, answers):
  7. print('What is your %s? It is %s.'%(q,a))
  8. """
  9. What is your name? It is lancelot.
  10. What is your quest? It is the holy grail.
  11. What is your favorite color? It is blue.
  12. --------------------------------------------------
  13. What is your name? It is lancelot.
  14. What is your quest? It is the holy grail.
  15. What is your favorite color? It is blue.
  16. """

要反向遍历一个序列,首先指定这个序列,然后调用 reversed() 函数:

  1. for i in reversed(range(1, 10, 2)):
  2. print(i)
  3. """
  4. 9
  5. 7
  6. 5
  7. 3
  8. 1
  9. """

要按顺序遍历一个序列,使用 sorted() 函数返回一个已排序的序列,并不修改原值:

  1. basket = ['apple', 'orange', 'apple', 'pear', 'orange', 'banana']
  2. for f in sorted(set(basket)):
  3. print(f)
  4. """
  5. apple
  6. banana
  7. orange
  8. pear
  9. """

Python列表函数&方法

Python包含以下函数:

序号 函数
1 len(list)
列表元素个数
2 max(list)
返回列表元素最大值
3 min(list)
返回列表元素最小值
4 list(seq)
将元组转换为列表

Python包含以下方法:

序号 方法
1 list.append(obj)
在列表末尾添加新的对象
2 list.count(obj)
统计某个元素在列表中出现的次数
3 list.extend(seq)
在列表末尾一次性追加另一个序列中的多个值(用新列表扩展原来的列表)
4 list.index(obj)
从列表中找出某个值第一个匹配项的索引位置
5 list.insert(index, obj)
将对象插入列表
6 list.pop([index=-1])
移除列表中的一个元素(默认最后一个元素),并且返回该元素的值
7 list.remove(obj)
移除列表中某个值的第一个匹配项
8 list.reverse()
反向列表中元素
9 list.sort( key=None, reverse=False)
对原列表进行排序
10 list.clear()
清空列表
11 list.copy()
复制列表

下面示例演示了列表的大部分方法:

  1. >>> a = [66.25, 333, 333, 1, 1234.5]
  2. >>> print(a.count(333), a.count(66.25), a.count('x'))
  3. 2 1 0
  4. >>> a.insert(2, -1)
  5. >>> a.append(333)
  6. >>> a
  7. [66.25, 333, -1, 333, 1, 1234.5, 333]
  8. >>> a.index(333)
  9. 1
  10. >>> a.remove(333)
  11. >>> a
  12. [66.25, -1, 333, 1, 1234.5, 333]
  13. >>> a.reverse()
  14. >>> a
  15. [333, 1234.5, 1, 333, -1, 66.25]
  16. >>> a.sort()
  17. >>> a
  18. [-1, 1, 66.25, 333, 333, 1234.5]

⚠️注意: 类似 insert, remove 或 sort 等修改列表的方法没有返回值。

将列表当做堆栈使用

列表方法使得列表可以很方便的作为一个堆栈来使用,堆栈作为特定的数据结构,最先进入的元素最后一个被释放(后进先出)。用 append() 方法可以把一个元素添加到堆栈顶。用不指定索引的 pop() 方法可以把一个元素从堆栈顶释放出来。例如:

  1. >>> stack = [3, 4, 5]
  2. >>> stack.append(6)
  3. >>> stack.append(7)
  4. >>> stack
  5. [3, 4, 5, 6, 7]
  6. >>> stack.pop()
  7. 7
  8. >>> stack
  9. [3, 4, 5, 6]
  10. >>> stack.pop()
  11. 6
  12. >>> stack.pop()
  13. 5
  14. >>> stack
  15. [3, 4]

将列表当作队列使用

也可以把列表当做队列用,只是在队列里第一加入的元素,第一个取出来;但是拿列表用作这样的目的效率不高。在列表的最后添加或者弹出元素速度快,然而在列表里插入或者从头部弹出速度却不快(因为所有其他的元素都得一个一个地移动)。

  1. from collections import deque
  2. queue = deque(["Eric", "John", "Michael"])
  3. queue.append("Terry") # Terry arrives
  4. queue.append("Graham") # Graham arrives
  5. print(queue.popleft()) # The first to arrive now leaves
  6. print( queue.popleft() ) # The second to arrive now leaves
  7. print( queue ) # Remaining queue in order of arrival
  8. """
  9. Eric
  10. John
  11. deque(['Michael', 'Terry', 'Graham'])
  12. """

列表推导式

列表推导式提供了从序列创建列表的简单途径。通常应用程序将一些操作应用于某个序列的每个元素,用其获得的结果作为生成新列表的元素,或者根据确定的判定条件创建子序列。
每个列表推导式都在 for 之后跟一个表达式,然后有零到多个 for 或 if 子句。返回结果是一个根据表达从其后的 for 和 if 上下文环境中生成出来的列表。如果希望表达式推导出一个元组,就必须使用括号。
这里我们将列表中每个数值乘三,获得一个新的列表:

  1. >>> vec = [2, 4, 6]
  2. >>> [3*x for x in vec]
  3. [6, 12, 18]

现在我们玩一点小花样:

  1. >>> [[x, x**2] for x in vec]
  2. [[2, 4], [4, 16], [6, 36]]

这里我们对序列里每一个元素逐个调用某方法:

  1. >>> freshfruit = [' banana', ' loganberry ', 'passion fruit ']
  2. >>> [weapon.strip() for weapon in freshfruit]
  3. ['banana', 'loganberry', 'passion fruit']

我们可以用 if 子句作为过滤器:

  1. >>> [3*x for x in vec if x > 3]
  2. [12, 18]
  3. >>> [3*x for x in vec if x < 2]
  4. []

以下是一些关于循环和其它技巧的演示:

  1. >>> vec1 = [2, 4, 6]
  2. >>> vec2 = [4, 3, -9]
  3. >>> [x*y for x in vec1 for y in vec2]
  4. [8, 6, -18, 16, 12, -36, 24, 18, -54]
  5. >>> [x+y for x in vec1 for y in vec2]
  6. [6, 5, -7, 8, 7, -5, 10, 9, -3]
  7. >>> [vec1[i]*vec2[i] for i in range(len(vec1))]
  8. [8, 12, -54]

列表推导式可以使用复杂表达式或嵌套函数:

  1. >>> [str(round(355/113, i)) for i in range(1, 6)]
  2. ['3.1', '3.14', '3.142', '3.1416', '3.14159']
  1. a = [[True if x**i >100 else x**i for i in [1,2,3]] for x in range(1,11) if x % 2 == 0]
  2. print (a)
  3. """
  4. [[2, 4, 8], [4, 16, 64], [6, 36, True], [8, 64, True], [10, 100, True]]
  5. """