全面解析 Python 列表(python列表教程)
Python 列表(list) 是开发中 最常用 的 Python 数据结构之一。列表支持各种 Python 数据类型,也能方便与 JSON 数据进行转换。
前后端交互中,列表扮演重要角色。虽然列表灵活,但是列表在特殊情况下也需要注意性能问题。
文本还将讲解 Python 生态库中的其他库处理数组的方法。
Python 列表基本概念
本质上Python 在语言层面,没有其他语言的数组的概念。而是使用 list 替代。
Python 列表的特点是:有序的、可变的数据集合。
与其静态类型语言不同的是, Python 列表极度灵活,类型上支持存储任意类型的元素。
my_list = [42, "Hello", 3.14, True, {"name": "Alice", "age": 30}, [1, 2, 3]]
以上示例中:list 使用常用的整型,浮点型,字符串,布尔类型,字典以及列表嵌套。
当然如果你要学习使用 Python 可以使用 Jupter Notebook,它很简单,支持分段和 markdown 文档。
Python 列表基本操作
- 创建列表: 使用方括号或 list() 构造函数创建列表。
- 访问元素: 通过索引访问,支持正向和反向索引。
- 列表切片: 获取子列表,支持开始、结束、步长参数。
- 修改元素: 通过索引直接修改列表中的元素。
- 添加元素: 使用 append() 在末尾添加元素,使用 insert() 在指定位置插入元素。
- 删除元素: 使用 remove() 删除特定值,使用 pop() 删除并返回指定索引的元素,使用 del 删除指定索引的元素或切片。
# 1. 创建列表
# 使用方括号创建
fruits = ["apple", "banana", "cherry", "date"]
# 使用 list() 构造函数创建
numbers = list([1, 2, 3, 4, 5])
# 2. 访问元素
# 正向索引
first_fruit = fruits[0] # "apple"
# 反向索引
last_number = numbers[-1] # 5
print("Last number:", last_number)
# 3. 列表切片
# 获取子列表
some_fruits = fruits[1:3] # ["banana", "cherry"]
# 使用步长参数
even_index_numbers = numbers[::2] # [1, 3, 5]
# 4. 修改元素
# 修改列表中的元素
fruits[1] = "blueberry"
# 5. 添加元素
# 在末尾添加元素
fruits.append("elderberry")
# 在指定位置插入元素
fruits.insert(2, "cantaloupe")
# 6. 删除元素
# 删除特定值
fruits.remove("apple")
# 删除并返回指定索引的元素
popped_fruit = fruits.pop(2)
# 使用 del 删除指定索引的元素
del fruits[0]
# 使用 del 删除列表切片
del numbers[1:3]
Python 列表常用方法
- 排序: 使用 sort() 进行就地排序,或使用 sorted() 返回排序后的新列表。
- 反转: 使用 reverse() 就地反转,或通过切片返回反转后的新列表。
- 查找元素: 使用 index() 查找元素的索引,使用 count() 统计元素出现的次数。
- 列表长度: 使用 len() 获取列表长度。
- 列表复制: 使用 copy() 方法进行浅拷贝。
# 创建示例列表
numbers = [4, 2, 9, 1, 5, 6, 8, 3, 7]
# 1. 排序
# 使用 sort() 进行就地排序
numbers.sort()
# 使用 sorted() 返回排序后的新列表
sorted_numbers = sorted(numbers, reverse=True)
# 2. 反转
# 使用 reverse() 就地反转
numbers.reverse()
# 使用切片返回反转后的新列表
reversed_numbers = numbers[::-1]
# 3. 查找元素
# 使用 index() 查找元素的索引
index_of_5 = numbers.index(5)
# 使用 count() 统计元素出现的次数
count_of_2 = numbers.count(2)
# 4. 列表长度
length_of_numbers = len(numbers)
# 5. 列表复制
# 使用 copy() 方法进行浅拷贝
copied_numbers = numbers.copy()
# 验证拷贝是浅拷贝(修改原列表不影响拷贝)
numbers.append(10)
Python 列表高级操作
- 列表推导式: 通过表达式快速生成列表,支持条件过滤。
- 嵌套列表: 列表内包含列表,用于表示矩阵或多维数据。
- 解包与链式赋值: 解包列表元素至多个变量,支持链式赋值。
- 合并与重复: 使用 + 合并列表,使用 * 重复列表元素。
- zip 函数: 并行迭代多个列表,生成元素对的迭代器。
# 1. 列表推导式
matrix = [
[1, 2, 3],
[4, 5, 6],
[7, 8, 9]
]
# 使用列表推导式将矩阵展平
flattened = [elem for row in matrix for elem in row]
# 生成偶数的平方数列表
even_squares = [x**2 for x in range(10) if x % 2 == 0]
# 2. 嵌套列表
# 访问矩阵中的元素
element = matrix[1][2] # 6
# 3. 解包与链式赋值
# 解包列表
values = [10, 20, 30]
a, b, c = values
# 链式赋值
x = y = z = 42
print("x:", x, "y:", y, "z:", z)
# 4. 合并与重复
# 合并两个列表
list1 = [1, 2, 3]
list2 = [4, 5, 6]
merged_list = list1 + list2
# 重复列表元素
repeated_list = list1 * 3
# 5. zip 函数
# 两个列表
names = ["Alice", "Bob", "Charlie"]
scores = [85, 92, 88]
# 使用 zip 合并两个列表
zipped = list(zip(names, scores))
# 解压缩
unzipped_names, unzipped_scores = zip(*zipped)
Python 列表性能优化
- 使用生成器代替列表: 在处理大数据时,通过生成器减少内存占用。
- 避免不必要的复制: 尽量在原地修改列表,避免内存浪费。
# 使用生成器来处理大数据,减少内存占用
def generate_squares(n):
for x in range(n):
yield x**2
# 创建一个生成器
squares_gen = generate_squares(10**6)
# 计算生成器中的前5个平方数
for _ in range(5):
print(next(squares_gen))
# 使用生成器的优点是它不会一次性占用大量内存
# 原地修改列表以避免不必要的复制
large_list = list(range(10**6))
# 原地修改:将每个元素加1
for i in range(len(large_list)):
large_list[i] += 1
# 打印修改后的前5个元素
print("First few elements of modified list:", large_list[:5])
Python 列表与JSON
在 web 开发中,JSON 数据传递是最为常见的数据使用场景,数组转换成 JSON 列表是常见的需求,Python 标准库提供了 json 包。使得我们能够方便的在两者数据之间进行转换。
import json
data_list = [
{
"name": "John",
"age": 30,
"children": [
{"name": "Jane", "age": 10},
{"name": "Doe", "age": 5}
]
}
]
# 1. 将 Python 列表转换为 JSON 字符串
json_string = json.dumps(data_list, indent=4)
# 2. 将 JSON 字符串转换为 Python 列表
parsed_data = json.loads(json_string)
Python 列表循环和遍历
既然是列表,循环和遍历其中的数据,是常见需求循环和遍历方式,大体还是 for-in 以及函数方法,以及列表推导。
numbers = [1, 2, 3, 4, 5]
fruits = ["apple", "banana", "cherry"]
# 1. 使用 for 循环遍历列表
for fruit in fruits:
print(fruit)
# 2. 使用 enumerate() 遍历列表及其索引
for index, fruit in enumerate(fruits):
print(f"Index: {index}, Fruit: {fruit}")
# 3. 使用 while 循环遍历列表
index = 0
while index < len(fruits):
print(fruits[index])
index += 1
# 4. 使用 map() 函数遍历列表
def square(x):
return x ** 2
# 创建一个 map 对象
squared_numbers = map(square, numbers)
# 遍历 map 对象
for num in squared_numbers:
print(num)
# 5. 使用 filter() 函数遍历列表
def is_even(x):
return x % 2 == 0
# 创建一个 filter 对象
even_numbers = filter(is_even, numbers)
# 遍历 filter 对象
for num in even_numbers:
print(num)
# 6. 使用列表推导式(作为遍历的变体)
squared_numbers = [x ** 2 for x in numbers]
Python 标准库 array
Python 标准库中的 array 模块提供了一个数组类型,用于存储固定类型的数据。
import array
# 创建一个整数数组
int_array = array.array('i', [1, 2, 3, 4, 5])
print("Array contents:", int_array)
# 访问数组中的元素
print("First element:", int_array[0])
Python NumPy 库中的数组
NumPy 数组:高性能、多维数组,适用于科学计算和数据分析。
import numpy as np
numpy_array = np.array([1, 2, 3, 4, 5])
print("Array shape:", numpy_array.shape) # Array shape: (5,)
print("Array mean:", numpy_array.mean()) # Array mean: 3.0
Python Pandas 库中数据框
Pandas 数据框:适用于数据分析和处理,提供了强大的功能和操作方法。
import pandas as pd
# 创建一个 Pandas Series(类似于一维数组)
series = pd.Series([1, 2, 3, 4, 5])
# 创建一个 Pandas DataFrame(类似于二维数组)
data = {'Column1': [1, 2, 3], 'Column2': [4, 5, 6]}
df = pd.DataFrame(data)