Python 分布式工具组合`

Python 分布式工具组合`,python,itertools,Python,Itertools,我正在使用itertools.compositionsinconjunction withitertools.cycle创建一组要分配给另一个对象列表的对象。不幸的是,如果列表的长度不相同或不可等分,那么列表中的第一个项的权重就会不均匀 cycle_of_combinations = cycle(combinations(['A', 'B', 'C', 'D'], 2)) #(('A', 'B'), # ('A', 'C'), # ('A', 'D'), # ('B', 'C'), #

我正在使用
itertools.compositions
inconjunction with
itertools.cycle
创建一组要分配给另一个对象列表的对象。不幸的是,如果列表的长度不相同或不可等分,那么列表中的第一个项的权重就会不均匀

cycle_of_combinations = cycle(combinations(['A', 'B', 'C', 'D'], 2))
#(('A', 'B'), 
# ('A', 'C'), 
# ('A', 'D'), 
# ('B', 'C'), 
# ('B', 'D'), 
# ('C', 'D'))

assigned_combinations = []
for _ in range(0, 9):
   assigned_combinations.append(cycle_of_combinations.next())

# assigned_combinations = [
# ('A', 'B'), 
# ('A', 'C'), 
# ('A', 'D'), 
# ('B', 'C'), 
# ('B', 'D'), 
# ('C', 'D'),
# ('A', 'B'), 
# ('A', 'C'), 
# ('A', 'D')]
在上述示例中,包含“A”的组合被过度表示。有没有一种快速的方法可以更好地均匀地分配组合

这是一个更均匀分布的集合示例,在这个集合中,我每2个项目选择一个,直到有9个项目:

# assigned_combinations = [
# ('A', 'B'), 
# ('A', 'D'), 
# ('B', 'D'), 
# ('A', 'C'), 
# ('B', 'C'), 
# ('C', 'D'),
# ('A', 'B'), 
# ('A', 'D'), 
# ('B', 'D')]

您可以生成足够的完整周期来覆盖所需的列表,然后洗牌并调整大小。每次返回的列表都会有点不同,并且您仍然会得到一些过度表示(不可避免的是大小不匹配和随机。shuffle可能会不时使其更加明显)


@用户2357112您是如何计算的?我发现
'A'
以6种组合中的3种出现,其中
'B'
'C'
'D'
也都是6种组合中的3种。你为什么在第6个元素处切断
指定的组合?这令人困惑地隐藏了您试图停止的效果。类似地,您在
cycle
下的注释隐藏了您实际创建了一个循环的事实(并且命名该变量
cycle
隐藏了您导入的
cycle
函数)。抱歉@user2357112,一定是在我的编辑过程中被意外剪切的。为了清晰起见,我还重新命名了cycle。
import math
import itertools
import random

def get_combos(somelist, length, count):
    combos = list(itertools.combinations(somelist, length))
    combos = combos * math.ceil(count/len(combos))
    random.shuffle(combos)
    return combos[:count]

for item in get_combos(['A', 'B', 'C', 'D'], 2, 9):
    print(item)