Выберите 50 элементов из списка случайным образом для записи в файл


130

Пока я понял, как импортировать файл, создавать новые файлы и рандомизировать список.

У меня возникли проблемы с выбором случайным образом только 50 элементов из списка для записи в файл?

def randomizer(input,output1='random_1.txt',output2='random_2.txt',output3='random_3.txt',output4='random_total.txt'):

#Input file 
    query=open(input,'r').read().split()
    dir,file=os.path.split(input)

    temp1 = os.path.join(dir,output1)
    temp2 = os.path.join(dir,output2)
    temp3 = os.path.join(dir,output3)
    temp4 = os.path.join(dir,output4)


    out_file4=open(temp4,'w')

    random.shuffle(query)

    for item in query:
        out_file4.write(item+'\n')   

Итак, если общий файл рандомизации был

example:

random_total = ['9','2','3','1','5','6','8','7','0','4']

Я бы хотел 3 файла (out_file1 | 2 | 3) с первым случайным набором из 3, вторым случайным набором из 3 и третьим случайным набором из 3 (для этого примера, но тот, который я хочу создать, должен иметь 50)

random_1 = ['9','2','3']
random_2 = ['1','5','6']
random_3 = ['8','7','0']

Таким образом, последняя «4» не будет включена, и это нормально.

Как мне выбрать 50 из случайного списка?

Более того, как я мог выбрать 50 случайным образом из исходного списка?


что вы имеете в виду?
O.rka

Ответы:


270

Если список составлен в случайном порядке, вы можете просто взять первые 50.

В противном случае используйте

import random
random.sample(the_list, 50)

random.sample текст справки:

sample(self, population, k) method of random.Random instance
    Chooses k unique random elements from a population sequence.

    Returns a new list containing elements from the population while
    leaving the original population unchanged.  The resulting list is
    in selection order so that all sub-slices will also be valid random
    samples.  This allows raffle winners (the sample) to be partitioned
    into grand prize and second place winners (the subslices).

    Members of the population need not be hashable or unique.  If the
    population contains repeats, then each occurrence is a possible
    selection in the sample.

    To choose a sample in a range of integers, use xrange as an argument.
    This is especially fast and space efficient for sampling from a
    large population:   sample(xrange(10000000), 60)

1
Могу ли я random.sampleвернуть также выбранные им индексы?
зыг

43

Один из простых способов выбрать случайные элементы - это перемешать, а затем нарезать.

import random
a = [1,2,3,4,5,6,7,8,9]
random.shuffle(a)
print a[:4] # prints 4 random variables

@MonicaHeddneck Почему случайное перемешивание и нарезка лучше? Разве выбор количества выборок путем случайного выбора не имел бы тех же достоинств, что и случайное перемешивание с последующим взятием фрагмента перемешанных выборок? Не могли бы вы объяснить? Спасибо.
salvu

7
Я использовал это, чтобы легко создать набор тестов / тренировок для проекта машинного обучения. Использование random.choice(mylist,3)не приведет к созданию двух непересекающихся наборов, как это было.
Моника Хедднек

29

Думаю random.choice(), это лучший вариант.

import numpy as np

mylist = [13,23,14,52,6,23]

np.random.choice(mylist, 3, replace=False)

функция возвращает массив из 3-х случайно выбранных значений из списка


7
Думаю нужно использовать random.choice(mylist, 3, replace=False). Также менее запутанный в использовании import numpy as npиnp.random.choice(mylist, 3, replace=False)
Джон Ла Рой

10
У этого есть шансы повторить пункт списка
Полло

Нет, это не лучший вариант, он примерно в 100 раз медленнее
nitesh kansal

-3

Допустим, в вашем списке 100 элементов, и вы хотите выбрать 50 из них случайным образом. Вот следующие шаги:

  1. Импортировать библиотеки
  2. Создайте семя для генератора случайных чисел, я поставил его на 2
  3. Подготовьте список номеров, из которых можно будет выбрать случайным образом
  4. Сделайте случайный выбор из списка номеров

Код:

from random import seed
from random import choice

seed(2)
numbers = [i for i in range(100)]

print(numbers)

for _ in range(50):
    selection = choice(numbers)
    print(selection)
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.