特定の長さのリストを保持するために、リスト内のランダムな項目を削除する方法は?

私は pymongo を使ってMongoDBのコレクションのリストをダンプしました。リストの長さは10000より大きく、約12000以上です(リストの長さは特定の数ではありません)。

しかし、私はリストの10000インスタンスだけが必要です。 l [:10000] または l [len(l)-10000:] でスライスできるリストは、 。しかし、私はおそらくリスト内の項目を削除するランダムな方法が良いと思う。

だから私はどのように長さを10000に減らすためにリスト内のランダムな項目を削除することができます知ってほしい長さ?ありがとう。

2
要素をランダムに削除することは、テスト容易性にとって非常に悪いことに注意してください。すべてのn番目の要素を削除するか、または上位のいくつかを削り取ることを検討することをお勧めします。
追加された 著者 kqr,

6 答え

まずリストをシャッフルしてからスライスします。

from random import shuffle
random.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`
5
追加された
ありがとう、リストの順序は関係ありません。そして、私はテストスクリプトを書いて、最初のものは0.01秒を使い、秒は0.08秒です。後者の方がずっと遅いのはなぜですか?
追加された 著者 zfz,
ありがとう!あなたの答えは本当に役に立ちます。
追加された 著者 zfz,
@zfzスライシングはforループより高速です。
追加された 著者 Ashwini Chaudhary,
@zfzと pop 演算と del 演算は高価です。
追加された 著者 Ashwini Chaudhary,
@zfzが助けてくれてうれしいです、それがあなたのために働くなら、あなたは答えを受け入れることができます。
追加された 著者 Ashwini Chaudhary,

ここに別の方法があります:

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)
1
追加された

順序を保持したい場合は、次のようにランダムなインデックスを削除できます。

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

この関数は l のリストから最大 count の項目を削除します。

1
追加された
確かに、固定:)
追加された 著者 Guillaume,
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
0
追加された

numpyを使うのはかなり簡単です(読みやすいように4つの項目を抽出するだけです):

>>> import numpy as np
>>> l = range(0, 12000)
>>> np.random.choice(np.asarray(l), 4, false)
0
追加された
あなたのコードで項目を何度も選択するかもしれません。
追加された 著者 David Zwicker,
正しい。編集済みの回答を参照してください。
追加された 著者 rectummelancolique,

ランダムにインポートする

subsample = random.sample(population、k)

0
追加された