如何显示itertools生成的排列?为何需用join处理元组输出?
为什么itertools.permutations生成的元组需要用join来打印,而不能直接遍历?
咱们先把问题拆解清楚:
首先,你要明白itertools.permutations()返回的是什么——它生成的是一个迭代器,其中每个元素都是元组。比如你用permutations(alphabets, 1)时,每个p是像('a',)这样的单元素元组;如果换成permutations(alphabets, 2),每个p就是('a', 'b')这类双元素元组。
为什么直接打印p会显示元组格式?
因为p本身就是元组类型,Python在打印元组的时候,会默认输出它的字面量形式(包括括号和逗号),所以你看到的是('a',)而不是单纯的a。
那能不能直接遍历p来打印?
其实是可以的,但要看你想要的输出效果:
- 如果是单元素元组(比如你代码里的长度1的排列),遍历
p的话:
这时候输出的就是单个字符for p in permutations(alphabets,1): for char in p: print(char)a、b...和print("".join(p))效果一样。 - 但如果是多元素元组(比如长度2的排列),遍历
p会把每个字符单独打印一行:
输出会是for p in permutations(alphabets,2): for char in p: print(char)a、b、a、c...每个字符占一行,这显然不是你想要的排列结果(你应该想看到ab、ac这种组合)。
为什么join是更优的选择?
str.join()方法专门用来拼接可迭代对象里的字符串元素——元组正好是可迭代的,而且里面的元素都是ASCII字母字符串。它会把元组里的所有字符拼接成一个完整的字符串,不管你的排列长度是1还是N,都能统一输出成紧凑的组合形式,代码也更简洁:
for p in permutations(alphabets,2): print("".join(p))
这时候输出就是ab、ac、ba...完全符合排列结果的展示需求。
简单说:直接遍历元组是逐个输出元素,而join是把元素拼成整体输出,两者的应用场景不同,而你需要的是后者的效果~
内容的提问来源于stack exchange,提问作者Praful
相关产品推荐
相关产品推荐

