说明
《Python 教程》 持续更新中,提供建议、纠错、催更等加作者微信: gairuo123(备注:pandas教程)和关注公众号「盖若」ID: gairuo。跟作者学习,请进入 Python学习课程。欢迎关注作者出版的书籍:《深入浅出Pandas》 和 《Python之光》。
itertools.permutations() 是 Python itertools 模块中的一个函数,用于生成给定可迭代对象的所有可能排列(permutations)。itertools.permutations() 生成一个迭代器,其中包含指定长度的所有可能排列。如果未指定长度 r,则默认生成与输入可迭代对象长度相同的排列。
语法为 itertools.permutations(iterable, r=None)
,连续返回由 iterable 元素生成长度为 r 的排列。如果 r 未指定或为 None ,r 默认设置为 iterable 的长度,这种情况下,生成所有全长排列。
参数与返回值:
注意事项:
排列元组会以字典顺序根据所输入 iterable 的顺序发出。 因此,如果所输入 iterable 是已排序的,组合元组也将按已排序的顺序生成。
即使元素的值相同,不同位置的元素也被认为是不同的。如果元素值都不同,每个排列中的元素值不会重复。
大致相当于:
def permutations(iterable, r=None):
# permutations('ABCD', 2) --> AB AC AD BA BC BD CA CB CD DA DB DC
# permutations(range(3)) --> 012 021 102 120 201 210
pool = tuple(iterable)
n = len(pool)
r = n if r is None else r
if r > n:
return
indices = list(range(n))
cycles = list(range(n, n-r, -1))
yield tuple(pool[i] for i in indices[:r])
while n:
for i in reversed(range(r)):
cycles[i] -= 1
if cycles[i] == 0:
indices[i:] = indices[i+1:] + indices[i:i+1]
cycles[i] = n - i
else:
j = cycles[i]
indices[i], indices[-j] = indices[-j], indices[i]
yield tuple(pool[i] for i in indices[:r])
break
else:
return
permutations() 的代码也可被改写为 product() 的子序列,只要将含有重复元素(来自输入中同一位置的)的项排除。
def permutations(iterable, r=None):
pool = tuple(iterable)
n = len(pool)
r = n if r is None else r
for indices in product(range(n), repeat=r):
if len(set(indices)) == r:
yield tuple(pool[i] for i in indices)
当 0 <= r <= n
,返回项个数为 n! / (n-r)!
;当 r > n
,返回项个数为0。
例如:
import itertools
it1 = itertools.permutations([1,2,3])
[*it1]
# [(1, 2, 3), (1, 3, 2), (2, 1, 3), (2, 3, 1), (3, 1, 2), (3, 2, 1)]
it2 = itertools.permutations([1,2,3], r=2)
[*it2]
# [(1, 2), (1, 3), (2, 1), (2, 3), (3, 1), (3, 2)]
import itertools
data = [1, 2, 3]
# 使用 permutations 生成长度为3的排列
result = itertools.permutations(data)
print(list(result))
# 输出 [(1, 2, 3), (1, 3, 2), (2, 1, 3), (2, 3, 1), (3, 1, 2), (3, 2, 1)]
import itertools
data = [1, 2, 3]
# 使用 permutations 生成长度为2的排列
result = itertools.permutations(data, 2)
print(list(result))
# 输出 [(1, 2), (1, 3), (2, 1), (2, 3), (3, 1), (3, 2)]
假设我们有一个字符列表,我们希望生成该列表的所有可能排列,用于密码破解或字符分析。
示例数据:
chars = ['a', 'b', 'c']
目标生成所有可能的字符排列:
[('a', 'b', 'c'), ('a', 'c', 'b'), ('b', 'a', 'c'), ('b', 'c', 'a'), ('c', 'a', 'b'), ('c', 'b', 'a')]
实现代码:
import itertools
chars = ['a', 'b', 'c']
# 使用 itertools.permutations 生成字符排列
result = itertools.permutations(chars)
print(list(result))
# 输出 [('a', 'b', 'c'), ('a', 'c', 'b'), ('b', 'a', 'c'),
# ('b', 'c', 'a'), ('c', 'a', 'b'), ('c', 'b', 'a')]
解释:
itertools.permutations(chars)
生成字符列表 chars 的所有可能排列。这个实用案例展示了如何使用 itertools.permutations() 生成一个可迭代对象的所有可能排列,非常适用于密码破解、比赛安排和数据分析的场景。
更新时间:2024-07-04 08:45:53 标签:python 排列 迭代