一、 Python List 详解
List(列表)是 Python 中最基本、最常用的数据结构之一,它是一个有序的可变序列,可以包含任意类型的元素。
1. 列表的基本特性
- 有序集合:元素按插入顺序存储
- 可变类型:可以修改、添加或删除元素
- 可包含任意类型:一个列表中可以混合存储不同类型的数据
- 支持索引和切片:可以通过位置访问元素
2. 创建列表
ini
# 空列表
empty_list = []
empty_list = list()
# 包含元素的列表
numbers = [1, 2, 3, 4, 5]
mixed = [1, "hello", 3.14, True]
nested = [[1, 2], [3, 4], [5, 6]]
# 使用 list() 构造函数
chars = list("hello") # ['h', 'e', 'l', 'l', 'o']
3. 访问列表元素
scss
fruits = ['apple', 'banana', 'cherry', 'date']
# 正向索引(从0开始)
print(fruits[0]) # 'apple'
print(fruits[2]) # 'cherry'
# 负向索引(从-1开始)
print(fruits[-1]) # 'date'
print(fruits[-3]) # 'banana'
# 切片操作 [start:stop:step]
print(fruits[1:3]) # ['banana', 'cherry']
print(fruits[:2]) # ['apple', 'banana']
print(fruits[::2]) # ['apple', 'cherry']
print(fruits[::-1]) # 反转列表 ['date', 'cherry', 'banana', 'apple']
4. 修改列表
ruby
# 修改单个元素
fruits[1] = 'blueberry'
# 修改切片
fruits[1:3] = ['blackberry', 'cantaloupe']
# 添加元素
fruits.append('elderberry') # 添加到末尾
fruits.insert(2, 'coconut') # 在指定位置插入
# 合并列表
more_fruits = ['fig', 'grape']
fruits.extend(more_fruits) # 或 fruits += more_fruits
5. 删除元素
ini
# 按值删除
fruits.remove('banana') # 删除第一个匹配项
# 按索引删除
del fruits[0] # 删除第一个元素
popped = fruits.pop(2) # 删除并返回第三个元素
popped_last = fruits.pop() # 删除并返回最后一个元素
# 清空列表
fruits.clear()
6. 列表常用方法
方法 | 描述 |
---|---|
append(x) |
在末尾添加元素 x |
extend(iterable) |
扩展列表,添加可迭代对象的所有元素 |
insert(i, x) |
在位置 i 插入元素 x |
remove(x) |
删除第一个值为 x 的元素 |
pop([i]) |
删除并返回位置 i 的元素(默认最后一个) |
clear() |
清空列表 |
index(x[, start[, end]]) |
返回第一个值为 x 的元素的索引 |
count(x) |
返回 x 在列表中出现的次数 |
sort(key=None, reverse=False) |
原地排序列表 |
reverse() |
原地反转列表 |
copy() |
返回列表的浅拷贝 |
7. 列表操作
python
# 长度
length = len(fruits)
# 成员检查
if 'apple' in fruits:
print("Apple is in the list")
# 遍历列表
for fruit in fruits:
print(fruit)
# 带索引遍历
for index, fruit in enumerate(fruits):
print(f"{index}: {fruit}")
# 列表推导式
squares = [x**2 for x in range(10)]
even_squares = [x**2 for x in range(10) if x % 2 == 0]
8. 列表排序
ini
numbers = [3, 1, 4, 1, 5, 9, 2]
# 原地排序
numbers.sort() # 升序
numbers.sort(reverse=True) # 降序
# 返回新列表
sorted_numbers = sorted(numbers)
sorted_numbers_desc = sorted(numbers, reverse=True)
# 自定义排序
words = ['banana', 'pie', 'Washington', 'book']
words.sort(key=len) # 按长度排序
words.sort(key=str.lower) # 不区分大小写排序
9. 列表复制
ini
original = [1, 2, 3]
# 浅拷贝
copy1 = original.copy()
copy2 = list(original)
copy3 = original[:]
# 深拷贝(用于嵌套列表)
import copy
deep_copy = copy.deepcopy(original)
10. 列表与性能
-
时间复杂度:
- 索引访问:O(1)
- 追加(append):平均 O(1)
- 插入(insert):O(n)
- 删除(remove/pop):O(n)
- 包含检查(in):O(n)
- 排序:O(n log n)
-
内存考虑:列表会预先分配额外空间以减少频繁调整大小的开销
11. 实际应用示例
ini
# 矩阵运算
matrix = [
[1, 2, 3],
[4, 5, 6],
[7, 8, 9]
]
# 转置矩阵
transposed = [[row[i] for row in matrix] for i in range(3)]
# 栈(后进先出)
stack = []
stack.append(1) # push
stack.append(2)
top = stack.pop() # pop -> 2
# 队列(先进先出)
from collections import deque
queue = deque(["Eric", "John", "Michael"])
queue.append("Terry") # 入队
queue.popleft() # 出队 -> "Eric"
列表是 Python 编程中最常用的数据结构之一,熟练掌握列表操作对于编写高效、简洁的 Python 代码至关重要。
二、 Python 中如何实现类似 JavaScript 数组方法的功能
以下是 JavaScript 中常见数组方法在 Python 中的对应实现:
1. forEach(遍历)
JavaScript:
javascript
arr.forEach(function(item, index) {
console.log(index, item);
});
Python 对应方法:
perl
# 使用 for 循环
arr = ['a', 'b', 'c']
for index, item in enumerate(arr):
print(index, item)
# 如果需要函数式风格,可以使用 map(但不会原地执行)
list(map(lambda item: print(item), arr)) # 不太推荐这种方式
2. map(映射)
JavaScript:
ini
let doubled = arr.map(function(item) {
return item * 2;
});
Python 对应方法:
ini
# 使用列表推导式(推荐)
arr = [1, 2, 3]
doubled = [item * 2 for item in arr]
# 使用 map 函数
doubled = list(map(lambda item: item * 2, arr))
3. filter(过滤)
JavaScript:
ini
let evens = arr.filter(function(item) {
return item % 2 === 0;
});
Python 对应方法:
ini
# 使用列表推导式(推荐)
arr = [1, 2, 3, 4, 5]
evens = [item for item in arr if item % 2 == 0]
# 使用 filter 函数
evens = list(filter(lambda item: item % 2 == 0, arr))
4. reduce(归约)
JavaScript:
bash
let sum = arr.reduce(function(acc, item) {
return acc + item;
}, 0);
Python 对应方法:
ini
from functools import reduce
arr = [1, 2, 3, 4]
sum = reduce(lambda acc, item: acc + item, arr, 0)
5. find(查找)
JavaScript:
ini
let found = arr.find(function(item) {
return item > 3;
});
Python 对应方法:
ini
# 使用 next 和生成器表达式
arr = [1, 2, 3, 4, 5]
found = next((item for item in arr if item > 3), None)
# 或者简单的循环
found = None
for item in arr:
if item > 3:
found = item
break
6. some(是否有元素满足条件)
JavaScript:
ini
let hasEven = arr.some(function(item) {
return item % 2 === 0;
});
Python 对应方法:
ini
arr = [1, 3, 5, 7, 8]
has_even = any(item % 2 == 0 for item in arr)
7. every(是否所有元素满足条件)
JavaScript:
ini
let allEven = arr.every(function(item) {
return item % 2 === 0;
});
Python 对应方法:
ini
arr = [2, 4, 6, 8]
all_even = all(item % 2 == 0 for item in arr)
8. 其他常用操作
连接数组 (concat)
JavaScript:
ini
let newArr = arr1.concat(arr2);
Python:
ini
new_arr = arr1 + arr2
查找索引 (indexOf)
JavaScript:
ini
let index = arr.indexOf('b');
Python:
ini
index = arr.index('b') # 如果找不到会抛出 ValueError
包含检查 (includes)
JavaScript:
ini
let hasItem = arr.includes('b');
Python:
ini
has_item = 'b' in arr
总结对比表
JavaScript 方法 | Python 对应实现 |
---|---|
forEach |
for 循环 + enumerate |
map |
列表推导式 或 map() 函数 |
filter |
列表推导式 或 filter() 函数 |
reduce |
functools.reduce() |
find |
next() + 生成器表达式 |
some |
any() |
every |
all() |
concat |
+ 运算符 |
indexOf |
index() 方法 |
includes |
in 运算符 |
Python 通常更倾向于使用列表推导式和内置函数来实现这些操作,而不是像 JavaScript 那样使用方法链。Python 的方式通常更简洁且更具可读性。