3

我使用pymongo转储 MongoDB 中的集合列表。列表长度大于10000,大约12000或更长(列表长度不是一定的数字)。

但是,我只需要 10000 个列表实例。我知道列表'l'可以按l[:10000]or切片l[len(l)-10000:]。但我认为删除列表中项目的随机方式可能会更好。

所以我想知道如何删除列表中的随机项目以使其长度减少到 10000 长?谢谢。

4

6 回答 6

6

先打乱列表,然后切片:

from random import shuffle
shuffle(your_lis)
your_lis = your_lis[:10000]

如果订单很重要:

from random import randrange
diff = len(your_lis) - 10000
for _ in xrange(diff):
    ind = randrange(len(your_lis))
    your_lis.pop(ind)  #a quick timing check suggests that `pop` is faster than `del`
于 2013-06-24T09:14:50.463 回答
1

如果要保持顺序,可以删除随机索引,例如:

def remove_random(l, count):
    for i in range(count):
        index = random.randint(0, len(l) - 1)
        del l[index]

count此功能将从 list 中删除最多项目l

于 2013-06-24T09:16:00.903 回答
1

这是另一种方式:

from random import random

def chop(the_list, length):
    while len(the_list) > length:
        del the_list[int(random()*length)]

# usage
chop(your_list, 10000)
于 2013-06-24T09:22:09.053 回答
0

使用 numpy 非常简单(为了便于阅读,只提取了 4 个项目):

>>> import numpy as np
>>> l = range(0, 12000)
>>> np.random.choice(np.asarray(l), 4, false)
于 2013-06-24T09:28:46.243 回答
0
def random_reduce(list, count):
    length = len(l)
    for i in range(count):
        index = random.randint(0, length - 1)
        del list[index]
        length = length - 1
于 2013-06-24T09:33:52.663 回答
0
import random

subsample=random.sample(population,k)

于 2013-06-25T11:09:59.613 回答