permutations返回迭代器而非列表,需用list()转换或遍历才能查看结果;支持r参数指定排列长度;不自动去重,含重复元素时需手动处理;可接受字符串、元组等可迭代对象,但传字典仅迭代键。

permutations 返回的是迭代器,不是列表
直接用 itertools.permutations 得到的结果是 itertools.permutations 对象,打印出来只显示类型和内存地址,不会自动展开。想看具体结果,必须手动转成列表或遍历。
- 错误写法:
print(permutations([1,2,3]))→ 输出类似<itertools.permutations object at></itertools.permutations> - 正确做法:
list(permutations([1,2,3]))或用for p in permutations([1,2,3]): print(p) - 注意:如果原列表很长(比如长度 ≥ 10),转成
list可能瞬间吃光内存,优先考虑按需迭代
permutations 默认生成全排列,但可指定长度 r
permutations(iterable, r=None) 的第二个参数 r 控制每个排列的元素个数。不传时等价于 r=len(iterable),即全排列;传了则只取 r 个元素的有序组合。
-
list(permutations('ab', 2))→[('a','b'), ('b','a')] -
list(permutations('abc', 2))→[('a','b'), ('a','c'), ('b','a'), ('b','c'), ('c','a'), ('c','b')] - 注意:
r > len(iterable)时返回空迭代器,不会报错,但list(...)得到空列表
输入含重复元素时,permutations 不去重
permutations 按位置计算,不关心值是否相同。若原始列表有重复值(如 [1,1,2]),结果中会出现语义重复的元组。
-
list(permutations([1,1,2]))返回 6 项,其中(1,1,2)和(1,1,2)看似一样,实则是不同位置的 1 组成的 —— 它们在内存中是两个独立对象,但值相等 - 若需真正去重,得套一层
set:list(set(permutations([1,1,2]))),但注意元组可哈希,而嵌套可变对象(如含列表)会报TypeError - 更稳妥的去重方式是先对输入排序 + 用
itertools.groupby,或改用more-itertools.distinct_permutations(需额外安装)
字符串、元组、range 都能直接传入,但别传 dict
permutations 接收任意可迭代对象,常见如 str、tuple、range、list,但传 dict 会只迭代 key(Python 3.7+ 保持插入序),容易误以为在排 value。
-
list(permutations('xyz'))→ 字符串被当字符序列处理,结果是('x','y','z')类型元组 -
list(permutations(range(2)))→ 等价于permutations([0,1]) -
list(permutations({1:'a', 2:'b'}))→ 实际排的是[1, 2],不是['a','b'];要排 value,得显式写permutations(list(d.values()))
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











