Python 中是否有迭代器可以给出乘积但忽略类本身的排列?

问题描述 投票:0回答:1

假设我想为 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) 视为不同的组合。我还有什么可以做的更好吗?

python combinations python-itertools combinatorics iterable
1个回答
0
投票

解决将三种颜色 (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)

说明:

  1. itertools.combinations_with_replacement(colors, balls)
    生成所有颜色组合,其中每种颜色可以多次使用,但不考虑顺序。
  2. Counter
    sorted
    用于计算每种颜色的出现次数并对它们进行排序,根据每种颜色的计数为每个组合创建唯一的键。
  3. 字典理解
    {tuple(sorted(Counter(comb).values())): comb for comb in combinations}
    确保每个独特的组合(无论颜色顺序如何)仅包含一次。
  4. 最后,独特的组合被打印出来。

此方法保证不会遗漏任何组合,并避免根据颜色顺序重复输入。

© www.soinside.com 2019 - 2024. All rights reserved.