将列表随机划分为两个互补的子列表



我有一个列表,我想把它随机分成两个已知大小的子列表,这两个子列表是彼此互补的。例如,我有[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)

最新更新