假设我想为 5 个不同的球指定颜色,并有 3 种颜色 r、b 和 g。我想迭代所有这些组合。最好我想省略等于颜色类别排列的组合。这意味着例如我想将 (r,b,b,b,b) 和 (g,r,r,r,r) 视为相等。 我可以用
itertools.product('rbg', repeat=5)
但这会多算很多。也许
itertools.combinations_with_replacement('rbg', 5)
会更好吗?我不确定这种做法会不会漏掉一些。但它肯定会将 (r,b,b,b,b) 和 (g,r,r,r,r) 视为不同的组合。我还有什么可以做的更好吗?
解决将三种颜色 (r, b, g) 之一分配给 5 个球并考虑相当于颜色类别排列的组合的问题(例如,(r,b,b,b,b) 和 (g,r ,r,r,r) 被认为是相同的),您可以使用
itertools.combinations_with_replacement
函数。此函数生成所有可能的颜色组合并进行替换,但不考虑顺序。
具体操作方法如下:
import itertools
from collections import Counter
colors = 'rbg'
balls = 5
# Generate all possible combinations with replacement
combinations = itertools.combinations_with_replacement(colors, balls)
# Use a dictionary to ensure uniqueness by counting occurrences
unique_combinations = {tuple(sorted(Counter(comb).values())): comb for comb in combinations}
# Print unique combinations
for comb in unique_combinations.values():
print(comb)
itertools.combinations_with_replacement(colors, balls)
生成所有颜色组合,其中每种颜色可以多次使用,但不考虑顺序。Counter
和 sorted
用于计算每种颜色的出现次数并对它们进行排序,根据每种颜色的计数为每个组合创建唯一的键。{tuple(sorted(Counter(comb).values())): comb for comb in combinations}
确保每个独特的组合(无论颜色顺序如何)仅包含一次。此方法保证不会遗漏任何组合,并避免根据颜色顺序重复输入。