随机将列表分为两个互补子列表
我有一个列表,想把它随机分成两个已知大小的子列表,这两个子列表是互补的。比如,我有 [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]
,但我现在的代码无法做到这一点。
随机模块里有没有我遗漏的内置选项?有没有人能提供一个简单的解决方案?
1 个回答
4
这样做怎么样呢?
先生成一个索引的列表,然后把它们打乱顺序:
>>> indices = range(len(pop))
>>> random.shuffle(indices)
接着,从这个索引列表中切出一部分,然后用 operator.itemgetter
来获取对应的项目:
>>> from operator import itemgetter
>>> itemgetter(*indices[:3])(pop)
(0, 0, 3)
>>> itemgetter(*indices[3:])(pop)
(5, 0)