Wybierz losowo 50 pozycji z listy, aby zapisać je do pliku

129

Do tej pory wymyśliłem, jak zaimportować plik, utworzyć nowe pliki i zmienić losowo listę.

Mam problem z wybraniem losowo tylko 50 pozycji z listy do zapisania w pliku?

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')   

Więc jeśli całkowity plik randomizacji to

example:

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

Chciałbym 3 pliki (out_file1 | 2 | 3) z pierwszym losowym zestawem 3, drugim losowym zestawem 3 i trzecim losowym zestawem 3 (w tym przykładzie, ale ten, który chcę utworzyć, powinien mieć 50)

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

Więc ostatnie „4” nie zostaną uwzględnione, co jest w porządku.

Jak mogę wybrać 50 z listy, którą utworzyłem losowo?

A nawet lepiej, jak mogę wybrać losowo 50 z oryginalnej listy?

O.rka
źródło
co masz na myśli?
O.rka

Odpowiedzi:

269

Jeśli lista jest w kolejności losowej, możesz po prostu wziąć pierwsze 50.

W przeciwnym razie użyj

import random
random.sample(the_list, 50)

random.sample Tekst pomocy:

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)
John La Rooy
źródło
1
Czy mogę random.samplezwrócić również wybrane przez siebie indeksy?
zyy
43

Prostym sposobem na wybranie losowych przedmiotów jest potasowanie, a następnie pokrojenie.

import random
a = [1,2,3,4,5,6,7,8,9]
random.shuffle(a)
print a[:4] # prints 4 random variables
Mani
źródło
@MonicaHeddneck Dlaczego losowe tasowanie i krojenie miałyby być lepsze? Czy wybranie liczby próbek przez losowanie wyboru nie miałoby takich samych zalet, jak losowe tasowanie, a następnie pobranie wycinka przetasowanych próbek? Czy możesz wyjaśnić? Dzięki.
salvu
7
Użyłem tego do łatwego tworzenia zestawu testowego / szkoleniowego dla projektu uczenia maszynowego. Użycie random.choice(mylist,3)nie stworzyłoby dwóch rozłącznych zestawów, jak to zrobiono.
Monica Heddneck
29

Myślę, że random.choice()to lepsza opcja.

import numpy as np

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

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

funkcja zwraca tablicę 3 losowo wybranych wartości z listy

Moein
źródło
7
Myślę, że musisz użyć random.choice(mylist, 3, replace=False). Również mniej kłopotliwe w użyciu import numpy as npinp.random.choice(mylist, 3, replace=False)
John La Rooy,
10
Jest to szansa na powtórzenie pozycji na liście
Paullo,
Nie, to nie jest lepsza opcja, jest ~ 100 razy wolniejsza
nitesh kansal
-3

Powiedzmy, że Twoja lista ma 100 elementów i chcesz wybrać 50 z nich w losowy sposób. Oto kroki, które należy wykonać:

  1. Zaimportuj biblioteki
  2. Utwórz ziarno dla generatora liczb losowych, umieściłem go na 2
  3. Przygotuj listę liczb, z których będziesz wybierać w losowy sposób
  4. Dokonaj losowych wyborów z listy liczb

Kod:

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)
AlketCecaj
źródło