我很难提出我的问题,所以我将举例说明。
x = ['abc', 'c', 'w', 't', '3']
a, b = random_split(x, 3) # first list should be length 3
# e.g. a => ['abc', 'w', 't']
# e.g. b => ['c', '3']
有没有一种简单的方法可以在保持原始顺序的同时将列表分成两个随机样本?
编辑:我知道我可以使用 random.sample 然后重新排序,但我希望有一种简单、简单的单行方法。
编辑2:这是另一个解决方案,看看你是否可以改进它:
def random_split(l, a_size):
a, b = [], []
m = len(l)
which = ([a] * a_size) + ([b] * (m - a_size))
random.shuffle(which)
for array, sample in zip(which, l):
array.append(sample)
return a, b
编辑 3:我对避免排序的担忧是,在最好的情况下它是O(N*log(N))
. 应该有可能获得一个可扩展的功能O(N)
不幸的是,到目前为止发布的解决方案都没有真正实现O(N)
虽然,经过一番思考,我找到了一个可行的方法,并且在性能方面与@PedroWerneck 的答案相当。不过,我不能 100% 确定这真的是随机的。
def random_split(items, size):
n = len(items)
a, b = [], []
for item in items:
if size > 0 and random.random() < float(size)/n:
b.append(item)
size -= 1
else:
a.append(item)
n -= 1
return a, b