如何用最Pythonic的方式打印列表中三个元素的唯一组合?
问题
请问用最简洁、最符合Python风格(Pythonic)的方式,打印以下列表中三个元素的所有唯一组合的方法是什么?
列表定义:
strats = ["1","2","3","4"]
要求需避免重复:
1 and 1 and 1 No (不唯一)
1 and 1 and 2 No (不唯一)
1 and 1 and 3 No (不唯一)
...
1 and 2 and 3 Yes
1 and 2 and 4 Yes
1 and 3 and 1 No (不唯一)
1 and 3 and 2 No (之前已出现过)
...
此处用数字仅为清晰展示,实际项目为24个文本字符串,逻辑一致。
以下是我的初次尝试:
strats = ["1","2","3","4"] for a in strats: for b in strats: for c in strats: if a != b and a != c and b!=c: print(a+" and "+b+" and "+c)
该代码的问题是输出存在重复:
1 and 2 and 3 Fine
1 and 2 and 4 Fine
1 and 3 and 2 Duplicate
1 and 3 and 4 Fine
1 and 4 and 2 Duplicate
1 and 4 and 3 Duplicate
...
解决方案
Python标准库中的itertools.combinations就是专门生成这种无重复元素、不考虑顺序组合的工具,完全匹配你的需求,代码简洁且高效:
from itertools import combinations strats = ["1", "2", "3", "4"] for combo in combinations(strats, 3): print(" and ".join(combo))
关键说明:
combinations(strats, 3)会从列表中选出所有3个元素的组合,每个组合内元素不重复,且同一组元素的不同排列只会出现一次(比如只会生成('1','2','3'),不会出现('1','3','2'))。- 用
" and ".join(combo)替代手动字符串拼接,是更符合Python风格的写法。 - 针对24个元素的场景,
itertools底层是C实现,性能远优于嵌套循环加条件判断的写法。
内容的提问来源于stack exchange,提问作者Ned Hulton
相关产品推荐
相关产品推荐

