在Python的标准库和第三方库中,permutation相关的方法可以实现序列元素的随机排列,也就是我们常说的洗牌操作,其中itertools模块的permutations函数以及numpy库的permutation函数是最常用的两种实现。

itertools.permutations的基本用法
itertools模块的permutations函数可以生成可迭代对象中所有元素的全排列,默认生成长度为序列长度的排列,也可以指定排列的长度。需要注意的是,它返回的是一个迭代器,不会直接修改原序列。
基础使用示例
我们可以先看一个对列表元素进行全排列的示例:
import itertools
# 定义待处理的列表
my_list = [1, 2, 3, 4]
# 生成全排列迭代器
perm_iter = itertools.permutations(my_list)
# 转换为列表查看所有排列结果
all_perms = list(perm_iter)
print(f"总共有{len(all_perms)}种排列方式")
# 打印前5种排列
for i, perm in enumerate(all_perms[:5]):
print(f"第{i+1}种排列:{perm}")
上述代码中,permutations函数接收一个可迭代对象作为参数,默认生成和原序列长度相同的排列,返回的迭代器中的每个元素都是一个元组,包含当前排列的所有元素。
指定排列长度
如果我们不需要全排列,只想获取指定长度的排列,可以给permutations函数传入第二个参数:
import itertools
my_str = "abc"
# 生成长度为2的排列
perm_iter = itertools.permutations(my_str, 2)
result = list(perm_iter)
print(result) # 输出:[('a', 'b'), ('a', 'c'), ('b', 'a'), ('b', 'c'), ('c', 'a'), ('c', 'b')]
numpy.random.permutation的用法
numpy库的permutation函数更偏向于随机洗牌的场景,它会随机打乱序列的顺序,返回一个新的打乱后的数组,原数组不会被修改。如果传入的是整数n,会生成0到n-1的随机排列。
随机洗牌示例
对数组进行随机洗牌的代码如下:
import numpy as np
# 定义数组
arr = np.array([10, 20, 30, 40, 50])
# 随机洗牌
shuffled_arr = np.random.permutation(arr)
print(f"原数组:{arr}")
print(f"洗牌后数组:{shuffled_arr}")
如果传入整数参数,会生成对应范围的随机序列:
import numpy as np # 生成0-4的随机排列 random_seq = np.random.permutation(5) print(random_seq) # 输出类似:[3 1 0 4 2]
两种permutation方法的区别
我们可以通过下面的表格对比两者的不同:
| 对比项 | itertools.permutations | numpy.random.permutation |
|---|---|---|
| 所属模块 | Python标准库itertools | 第三方库numpy |
| 返回类型 | 迭代器 | numpy数组 |
| 功能特点 | 生成所有指定长度的排列,有序 | 随机打乱顺序,返回单次随机结果 |
| 是否需要额外安装 | 不需要,标准库自带 | 需要安装numpy库 |
使用注意事项
- itertools.permutations生成的是所有排列,当序列长度较长时,排列总数会呈阶乘级增长,可能导致内存占用过高,这种情况建议按需迭代处理,不要一次性转换为列表。
- numpy.random.permutation每次调用都会生成新的随机结果,如果需要固定的随机结果,可以先设置随机种子:
np.random.seed(42)。 - 两个方法都不会修改原序列,而是返回新的结果,如果需要原地修改列表,可以结合random模块的shuffle方法使用。
常见问题解答
permutation方法能不能直接修改原列表?
不能,无论是itertools的permutations还是numpy的permutation,都不会修改传入的原序列,只会返回新的排列结果。如果需要修改原列表,可以这样做:
import itertools import numpy as np my_list = [1, 2, 3, 4] # 使用itertools获取一个全排列替换原列表 my_list[:] = next(itertools.permutations(my_list)) print(my_list) # 使用numpy获取随机排列替换原列表 arr = np.array([1,2,3,4]) shuffled = np.random.permutation(arr) arr[:] = shuffled print(arr)
如何对多维数组进行洗牌?
numpy的permutation方法如果传入多维数组,默认只会沿着第一个轴(行方向)进行洗牌:
import numpy as np multi_arr = np.array([[1,2],[3,4],[5,6]]) # 按行洗牌 shuffled_multi = np.random.permutation(multi_arr) print(shuffled_multi)
Pythonpermutation洗牌迭代器修改时间:2026-06-26 20:24:53