Python序列操作全解析:列表与元组的深度探索
立即解锁
发布时间: 2025-08-29 10:27:49 阅读量: 8 订阅数: 14 

# Python 序列操作全解析:列表与元组的深度探索
## 1. 序列比较运算符
在 Python 中,可以使用比较运算符逐元素地比较整个列表。以下是一些示例代码:
```python
a = [1, 2, 3]
b = [1, 2, 3]
c = [1, 2, 3, 4]
print(a == b) # True: 两个列表对应元素相等
print(a == c) # False: a 和 c 元素和长度不同
print(a < c) # True: a 的元素数量少于 c
print(c >= b) # True: 元素 0 - 2 相等,但 c 元素更多
```
## 2. 元组的特性与操作
### 2.1 元组概述
元组是不可变的,通常用于存储异构数据,但数据也可以是同质的。元组的长度是其元素的数量,在程序执行期间不能改变。
### 2.2 创建元组
- 创建空元组:使用空括号。
```python
student_tuple = ()
print(student_tuple) # ()
print(len(student_tuple)) # 0
```
- 打包元组:用逗号分隔值。
```python
student_tuple = 'John', 'Green', 3.3
print(student_tuple) # ('John', 'Green', 3.3)
print(len(student_tuple)) # 3
```
- 创建单元素元组:需要在元素后面加逗号。
```python
a_singleton_tuple = ('red',)
print(a_singleton_tuple) # ('red',)
```
### 2.3 访问元组元素
元组元素通常是多种类型的,一般不进行迭代,而是单独访问。元组索引从 0 开始。
```python
time_tuple = (9, 16, 1)
print(time_tuple) # (9, 16, 1)
print(time_tuple[0] * 3600 + time_tuple[1] * 60 + time_tuple[2]) # 33361
```
注意,给元组元素赋值会引发 `TypeError`。
### 2.4 向字符串或元组添加项
虽然字符串和元组是不可变的,但可以使用 `+=` 增强赋值语句。
```python
tuple1 = (10, 20, 30)
tuple2 = tuple1
print(tuple2) # (10, 20, 30)
tuple1 += (40, 50)
print(tuple1) # (10, 20, 30, 40, 50)
print(tuple2) # (10, 20, 30)
```
`+=` 右边的项必须分别是字符串或元组,混合类型会引发 `TypeError`。
### 2.5 元组包含可变对象
元组可以包含可变对象,如列表。
```python
student_tuple = ('Amanda', 'Blue', [98, 75, 87])
student_tuple[2][1] = 85
print(student_tuple) # ('Amanda', 'Blue', [98, 85, 87])
```
## 3. 序列解包
可以将任何序列的元素解包到逗号分隔的变量列表中。如果赋值符号左边的变量数量与右边序列的元素数量不相同,会引发 `ValueError`。
```python
student_tuple = ('Amanda', [98, 85, 87])
first_name, grades = student_tuple
print(first_name) # 'Amanda'
print(grades) # [98, 85, 87]
first, second = 'hi'
print(f'{first} {second}') # h i
number1, number2, number3 = [2, 3, 5]
print(f'{number1} {number2} {number3}') # 2 3 5
number1, number2, number3 = range(10, 40, 10)
print(f'{number1} {number2} {number3}') # 10 20 30
```
### 3.1 通过打包和解包交换值
```python
number1 = 99
number2 = 22
number1, number2 = (number2, number1)
print(f'number1 = {number1}; number2 = {number2}') # number1 = 22; number2 = 99
```
### 3.2 使用 `enumerate` 安全访问索引和值
`enumerate` 函数接收一个可迭代对象,创建一个迭代器,为每个元素返回一个包含元素索引和值的元组。
```python
colors = ['red', 'orange', 'yellow']
print(list(enumerate(colors))) # [(0, 'red'), (1, 'orange'), (2, 'yellow')]
print(tuple(enumerate(colors))) # ((0, 'red'), (1, 'orange'), (2, 'yellow'))
for index, value in enumerate(colors):
print(f'{index}: {value}')
```
### 3.3 创建简单条形图
以下脚本创建一个简单的条形图,每个条形的长度由星号(*)组成,与列表的对应元素值成比例。
```python
numbers = [19, 3, 15, 7, 11]
print('\nCreating a bar chart from numbers:')
print(f'Index{"Value":>8} Bar')
for index, value in enumerate(numbers):
print(f'{index:>5}{value:>8} {"*" * value}')
```
## 4. 序列切片
可以对序列进行切片,创建包含原始元素子集的相同类型的新序列。切片操作可以修改可变序列,不修改序列的操作对列表、元组和字符串的工作方式相同。
### 4.1 指定起始和结束索引的切片
```python
numbers = [2, 3, 5, 7, 11, 13, 17, 19]
print(numbers[2:6]) # [5, 7, 11, 13]
```
切片从冒号左边的起始索引(2)复制元素到冒号右边的结束索引(6)之前,但不包括结束索引的元素。原始列表不会被修改。
### 4.2 仅指定结束索引的切片
如果省略起始索引,默认从 0 开始。
```python
print(numbers[:6]) # [2, 3, 5, 7, 11, 13]
```
### 4.3 仅指定起始索引的切片
如果省略结束索引,Python 假设序列的长度。
```python
print(numbers[6:]) # [17, 19]
```
### 4.4 不指定索引的切片
省略起始和结束索引会复制整个序列。
```python
print(numbers[:]) # [2, 3, 5, 7, 11, 13, 17, 19]
```
切片创建新对象,但进行的是浅拷贝,即复制元素的引用而不是它们指向的对象。
### 4.5 带步长的切片
```python
print(numbers[::2]) # [2, 5, 11, 17]
```
这里省略了起始和结束索引,默认分别为 0 和 `len(numbers)`。
### 4.6 带负索引和步长的切片
可以使用负步长以逆序选择切片。
```python
print(numbers[::-1]) # [19, 17, 13, 11, 7, 5, 3, 2]
```
### 4.7 通过切片修改列表
```python
numbers[0:3] = ['two', 'three', 'five']
print(numbers) # ['two', 'three', 'five', 7, 11, 13, 17, 19]
numbers[0:3] = []
print(numbers) # [7, 11, 13, 17, 19]
numbers = [
```
0
0
复制全文
相关推荐









