我有一个列表,我想把它随机分成两个已知大小的子列表,这两个子列表是彼此互补的。例如,我有[1,5,6,8,9]
,我想把它分成[1,5,9]
和[6,8]
。我不太关心效率,只想让它工作。顺序不重要
开头:
pop = [...] #some input
samp1 = random.sample(pop, samp1len)
samp2 = [x for x in pop if x not in samp1]
然而,这个解决方案在重复的项目中失败了。如果是pop = [0,0,0,3,5]
,并且长度3的第一个选择是[0,3,5]
,我仍然希望samp2是[0,0]
,我的代码目前无法提供。
是否有一些内置的选项在随机,我错过了?有人能提供一个简单的解决方案吗?
这样怎么样?
生成索引列表并对其进行洗牌:
>>> indices = range(len(pop))
>>> random.shuffle(indices)
然后切片索引列表,并使用operator.itemegetter
获得项目:
>>> from operator import itemgetter
>>> itemgetter(*indices[:3])(pop)
(0, 0, 3)
>>> itemgetter(*indices[3:])(pop)
(5, 0)