分布式`itertools.combinations`

时间:2017-05-15 20:22:52

标签: python itertools

我正在使用itertools.combinationsitertools.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')]

1 个答案:

答案 0 :(得分:1)

您可以生成足够的完整周期来覆盖所需的列表,然后随机播放并修剪大小。返回的列表每次都会有点不同,你仍会得到一些过度的表示(不可避免的大小不匹配,random.shuffle可能会使它更加明显)。

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)