Combinations with limited repeats in Python

邮差的信 提交于 2019-12-10 17:45:14

问题


I know how to get ALL combinations of a list in Python with itertools, but what if I want to limit the amount of repeats?

So, if I have [1, 2, 3, 4, 5]

But I want to limit combinations to only 3 repeats of each item (with a fixed length of the final list, say 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]

and so on. How do I do this?


回答1:


This would work:

import random

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



回答2:


I don't know if there is a more elegant way but that seems to work:

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)



回答3:


You could do it the following way: Use [1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4, 5, 5, 5] and use itertools.combination(the list from above, 10). That would mean that each element occurs at most three times in a resulting list.

Example with smaller list:

Edited to ensure every combination occurs exactly once, the combinations occur in random order and, finally, every combination has a random order. Also incorporated the idea of Mike Müller to just multiply the list by 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

which will give:

[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]


来源:https://stackoverflow.com/questions/34832998/combinations-with-limited-repeats-in-python

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!