Python中重复次数有限的组合

时间:2016-01-16 22:45:58

标签: python limit combinations itertools

我知道如何在Python中使用itertools获取列表的所有组合,但是如果我想限制重复量呢?

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

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

[1, 1, 1, 2, 3, 3, 5, 5, 5, 4]
[1, 2, 3, 3, 3, 4, 5, 5, 4, 4]
[4, 4, 1, 1, 1, 5, 2, 2, 2, 3]

等等。我该怎么做?

3 个答案:

答案 0 :(得分:1)

这样可行:

import random

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

答案 1 :(得分:0)

你可以通过以下方式实现:使用[1,1,1,2,2,3,3,3,4,4,4,5,5,5]并使用itertools.combination(< em>上面的列表,10)。这意味着每个元素在结果列表中最多出现三次。

列表较小的示例:

编辑以确保每个组合恰好发生一次,组合以随机顺序发生,最后,每个组合都有一个随机顺序。 还结合了MikeMü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]

答案 2 :(得分:0)

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

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)