Python List 详解

一、 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 的方式通常更简洁且更具可读性。

相关推荐
Yweir5 分钟前
Elastic Search 8.x 分片和常见性能优化
java·python·elasticsearch
小蜗牛狂飙记42 分钟前
在github上传python项目,然后在另外一台电脑下载下来后如何保障成功运行
开发语言·python·github
倔强青铜三1 小时前
苦练Python第27天:嵌套数据结构
人工智能·python·面试
倔强青铜三1 小时前
苦练Python第26天:精通字典8大必杀技
人工智能·python·面试
creator_Li2 小时前
python学习笔记
笔记·python·学习
DeniuHe2 小时前
基于Pytorch的人脸识别程序
pytorch·python·深度学习
万粉变现经纪人3 小时前
如何解决pip安装报错ModuleNotFoundError: No module named ‘django’问题
后端·python·pycharm·django·numpy·pandas·pip
仰望星空的凡人3 小时前
【JS逆向基础】数据库之mysql
javascript·数据库·python·mysql
二向箔reverse3 小时前
Selenium 攻略:从元素操作到 WebDriver 实战
python·selenium·测试工具
小屁孩大帅-杨一凡3 小时前
如何使用Python将HTML格式的文本转换为Markdown格式?
开发语言·前端·python·html