[英]Group list of items randomly, but some items cannot be in same group
我有一个要放入n个组的名称列表。 我可以轻松做到。 但是,我的问题是,某些项目无论如何都无法组合在一起。 有一个简单的解决方案吗?
我现在是这样的:
import random
name_list = ["Item1", "Item2", "Item3", "Item4", "Item5", "Item6", "Item7"]
n = 2
random.seed(4)
random.shuffle(name_list)
test = [name_list[i:i + n] for i in xrange(0, len(name_list), n)]
print(test)
因此,从中,我将得到随机分组的4个组,最后一组中只有1个(没关系)。 但是,假设Item1
和Item5
不能一起结束。 我要如何点呢?
在这里,我们得到了随机分配的物品的组或“块”。
给定
import random
import itertools as it
import more_itertools as mit
random.seed(4)
n = 2
name_list = ["Item1", "Item2", "Item3", "Item4", "Item5", "Item6", "Item7"]
blacklist = ["Item1", "Item5"]
码
def get_random_groups(lst, size=2, blacklist=None):
"""Return distributed items among `m` groups of lists."""
if blacklist is None:
blacklist = []
# Compute number of chunks
length = (len(lst))
if length % 2 == 0:
m = length//size
else:
m = (length+1)//size
# Edge cases
if len(blacklist) > m:
raise ValueError("Black-list is too long. Must be < number of chunks.")
if not set(blacklist).issubset(set(lst)):
raise ValueError("Black-list is not a subset of the main list.")
# Resize list
remnant_list = list(set(lst) - set(blacklist))
random.shuffle(remnant_list)
# Build chunks and distribute (blacklist first)
chunks = [list(c) for c in mit.distribute(m, blacklist)]
random.shuffle(chunks)
for chunk in chunks[:]:
while len(chunk) < size:
try:
chunk += [remnant_list.pop(-1)]
except IndexError:
return chunks
演示版
# Without blacklist
get_random_groups(name_list, size=n)
# Out: [['Item5', 'Item1'], ['Item3', 'Item6'], ['Item7', 'Item2'], ['Item4']]
# With blacklist
get_random_groups(name_list, size=n, blacklist=blacklist)
# [['Item2', 'Item6'], ['Item1', 'Item3'], ['Item5', 'Item7'], ['Item4']]
# Invalid blacklist
blacklist = "Item1 Item3 Item 5 Item6 Item7".split()
get_random_groups(name_list, size=n, blacklist=blacklist)
# ValueError: Blacklist is too long. Must be < number of chunks.
# Invalid blacklist
blacklist = "Item1 Item9".split()
get_random_groups(name_list, size=n, blacklist=blacklist)
# ValueError("Black-list is not a subset of the main list.")
细节
blacklist
项目将首先在大块之间分配。 因此,必须从其余元素列表( remnant_list
)中删除这些项目。 more_itertools.distribute
是一种第三方工具,可促进在m
个块之间进行块 分配和分配 。 您可以选择实现自己的算法来完成这两项任务。 size
,否则将随机余项添加到随机的块中。 这种双重改组可确保物品随机放置。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.