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

4 投票
1 回答
541 浏览
提问于 2025-04-18 11:37

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

撰写回答