Python中具有有限重复的组合

Python中具有有限重复的组合,python,limit,combinations,itertools,Python,Limit,Combinations,Itertools,我知道如何使用itertools在Python中获得列表的所有组合,但是如果我想限制重复的数量,该怎么办 如果我有[1,2,3,4,5] 但我想将组合限制为每个项目仅重复3次(最终列表的长度固定,比如10次): 等等。如何做到这一点?您可以通过以下方式做到:使用[1,1,1,2,2,3,3,3,4,4,4,5,5,5],然后使用itertools.composition(上面的列表,10)。这意味着每个元素在结果列表中最多出现三次 列表较小的示例: 编辑以确保每个组合只出现一次,组合以随机顺序出

我知道如何使用itertools在Python中获得列表的所有组合,但是如果我想限制重复的数量,该怎么办

如果我有[1,2,3,4,5]

但我想将组合限制为每个项目仅重复3次(最终列表的长度固定,比如10次):


等等。如何做到这一点?

您可以通过以下方式做到:使用[1,1,1,2,2,3,3,3,4,4,4,5,5,5],然后使用itertools.composition(上面的列表,10)。这意味着每个元素在结果列表中最多出现三次

列表较小的示例:

编辑以确保每个组合只出现一次,组合以随机顺序出现,最后,每个组合都具有随机顺序。 他还采纳了Mike Müller的想法,将列表乘以3

import itertools
import random
combinations = set()
for c in itertools.combinations(sorted([1, 2, 3] * 3), 5):
    combinations.add(c)
shuffledCombinations = list(combinations)
random.shuffle(shuffledCombinations)
for combination in shuffledCombinations:
    copiedCombination = list(combination)
    random.shuffle(copiedCombination)
    print copiedCombination
这将提供:

[2, 1, 3, 2, 2]
[2, 2, 1, 1, 2]
[3, 3, 3, 1, 2]
[2, 2, 3, 2, 3]
[1, 2, 3, 1, 2]
[1, 1, 1, 2, 3]
[2, 1, 1, 1, 2]
[3, 3, 1, 1, 1]
[1, 3, 3, 3, 1]
[3, 2, 3, 2, 3]
[3, 2, 1, 2, 3]
[1, 1, 2, 3, 3]

我不知道是否有更优雅的方式,但这似乎有效:

from itertools import combinations_with_replacement
a = [1, 2, 3, 4, 5] # can contain letters as well
all_combinations = combinations_with_replacement(a, 10)

filtered_results = []
for current in all_combinations:
   throw_away = False
   for item in current:
      if current.count(item) > 3:
        throw_away = True
        break
   if not throw_away:
     filtered_results.append( current )

for j in filtered_results:
   print(j)
这将有助于:

import random

L = [1, 2, 3, 4, 5]
L3 = L * 3
random.shuffle(L3)
L3[:10]

重复的元素可以是随机的还是预期的特定模式?它们可以是随机的,我只是不想以这样的方式结束:[1,1,1,1,1,1,1,1,1][1,1,1,1,1,1,1,1,1,2][1,1,1,1,1,1,1,1,1,1,3]我试过了,但它似乎没有给我想要的东西(不够随机)。也许我想要置换?itertools将以非随机顺序为您提供结果。您可以做的是:收集一组列表(获取所有组合,但不重复),然后将它们随机排列以获得它们。或者你所说的“我想要他们所有人”和“我需要随机化”的组合是什么意思?我基本上是在32个空间中寻找[0-9][a-f]的组合,但我对aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa。计算所有的组合都需要一个生命周期,然后需要更多的时间,所以我认为我可以更聪明一点,并将每个项目的出现次数限制在3次。也许一个例子(对于较小的输入集)会对您有所帮助-正如您上面提到的,可能您真的在寻找排列而不是组合,或者你想要组合,但不是按排序的顺序,或者……我刚刚在7个位置尝试了[0-9a-f],它已经给出了157488个组合(对于我上面的算法)。对于32个位置,这仍然需要一辈子的时间:-)有没有办法确保我得到所有可能的结果?从所有组合的集合中随机选择一个组合是一种非常优雅的方式……但我认为OP想要的是集合,而不是其中的一个样本。@TomZych我认为你是对的。最初的问题在这里并不十分清楚,但评论表明了这一点。也许我的建议对其他人有帮助。如果我也想写字母呢?没有任何变化也一样有效。试试a=['a','b',1,2,3]
import random

L = [1, 2, 3, 4, 5]
L3 = L * 3
random.shuffle(L3)
L3[:10]