我知道如何在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]
等等。我该怎么做?
答案 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)