Python打印Sobert口味组合出现重复配对及代码逻辑咨询
Sorbet口味组合重复打印问题原理讲解
原始代码产生重复的原因
你的原始代码是两层完整遍历FLAVORS列表的嵌套循环,只要两个元素不相等就打印,本质是生成有序排列:
- 当外层循环取到
Banana、内层取到Chocolate时,会打印Banana, Chocolate - 当外层循环取到
Chocolate、内层取到Banana时,满足x != y的判断,会再次打印Chocolate, Banana
两种顺序的同一组合都会被输出,就产生了重复。
无重复代码的实现逻辑
这段代码的核心逻辑是:强制让配对里的第一个口味在列表中的位置,永远排在第二个口味前面,从根源上避免反向重复的情况:
- 外层循环每次取一个口味
flavor_one,先用FLAVORS.index(flavor_one)拿到这个口味在列表里的下标,比如Banana的下标是0,Chocolate的下标是1 - 内层循环的遍历范围是
range(当前口味下标 + 1, 列表总长度),也就是只遍历排在flavor_one后面的所有口味:- 当
flavor_one是Banana(下标0)时,内层只遍历下标1到6的口味,生成Banana和后面所有口味的配对 - 当
flavor_one是Chocolate(下标1)时,内层只遍历下标2到6的口味,只会生成Chocolate和后面口味的配对,不会再回头和前面的Banana配对
这样所有输出的配对都是「列表位置靠前的口味 + 列表位置靠后的口味」,自然就不会出现反向重复的配对了。
- 当
更简洁的标准库实现
Python标准库内置了生成无重复组合的工具,效果和上面的代码完全一致:
from itertools import combinations FLAVORS = [ "Banana", "Chocolate", "Lemon", "Pistachio", "Raspberry", "Strawberry", "Vanilla", ] for pair in combinations(FLAVORS, 2): print(", ".join(pair))
内容的提问来源于stack exchange,提问作者APPrentice
相关产品推荐
相关产品推荐

