Як видалити випадкові елементи у списку, щоб зберегти список певною довжиною?

Я використав pymongo для зняття списку колекцій у MongoDB. Довжина списку перевищує 10000, приблизно 12000 або довше (довжина списку не є певним числом).

Однак мені потрібні лише 10 000 екземплярів списку. Я знаю, що список 'l' здатний скинути за допомогою 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 відбувається швидше, ніж для циклу.
додано Автор 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]

Ця функція буде видаляти елементи count зі списку l .

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, джерело

імпортувати випадково

subample = random.sample (населення, k)

0
додано
ІТ КПІ - Python
ІТ КПІ - Python
625 учасників

Канал обговорень про всякі штуки зі світу пайтону. Прохання: 0. мати повагу одне до одного; 1. не матюкатися в сторону людей; 2. не захламляти тред повідомленнями по одному слову;