我正在使用itertools.combinations
与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')]
答案 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)