Python 高效地计算具有复杂限制的组合以获得大N

Python 高效地计算具有复杂限制的组合以获得大N,python,optimization,vectorization,combinations,Python,Optimization,Vectorization,Combinations,我有一个32个独特元素的列表。每个元素由一个唯一的键表示,值可以是三种类型之一:a、B和C elements={1:'A', 2:‘A’, 3:‘B’, 4:‘C’, ... ... 32:'B'} 类型的表示并不相同,即:类型B可能比类型A或C出现的次数更多 我需要得到所有可能的符合以下限制的组合: 必须由6个元素组成 每种类型只允许2个实例(不少于,不多于) 钥匙不能重复 秩序无关紧要 示例(简化符号): [1A、12A、3B、6B、4C、5C]:包含2xA、2xB、2xC 有没有

我有一个32个独特元素的列表。每个元素由一个唯一的键表示,值可以是三种类型之一:
a
B
C

elements={1:'A',
2:‘A’,
3:‘B’,
4:‘C’,
...
...
32:'B'}
类型的表示并不相同,即:类型
B
可能比类型
A
C
出现的次数更多

我需要得到所有可能的符合以下限制的组合:

  • 必须由6个元素组成
  • 每种类型只允许2个实例(不少于,不多于)
  • 钥匙不能重复
  • 秩序无关紧要
示例(简化符号):

  • [1A、12A、3B、6B、4C、5C]
    :包含2xA、2xB、2xC
有没有一种方法可以有效地做到这一点,使用矩阵/向量化或集合和并集/连接


我可能可以使用
itertools.combinations(elements,r=6)
获得所有的组合,只需稍加调整,但我不确定如何有效地执行这些规则,而不必遍历所有(906192)组合。

只是想了解:迭代906192元素有什么错?您需要多次调用这样的函数吗?您可能应该创建一个从值到键的反向映射。例如,
{“A”:[1,2,…],“B”:3,…,32]}
等。然后,您可以从每个原始值中随机选择(不替换)两个索引。这是一种非常有效的方法。@I我会尽可能地提高效率,主要是作为一种练习。然而,我的元素列表可能会随着时间的推移而增长,这将导致越来越多的组合。反向映射的想法听起来是正确的;我要试一试。