2013-03-19 14 views
45

Do tej pory znalazłem sposób na importowanie pliku, tworzenie nowych plików i losowanie listy.Wybierz losowo 50 pozycji z listy, aby napisać do pliku

Mam problem z wyborem losowo tylko 50 pozycji z listy, aby zapisać do 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żeli łączna plik randomizacji był

example: 

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

chciałbym 3 pliki (out_file1 | 2 | 3) z pierwszym losowej zestaw 3, w drugim losowy zestaw 3, a trzeci losowo zestaw 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'] 

Tak więc ostatnie "4" nie zostanie uwzględnione, co jest w porządku.

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

Co jeszcze lepiej mogę wybrać losowo 50 z oryginalnej listy?

+0

co masz na myśli? –

Odpowiedz

109

Jeżeli lista jest w losowej kolejności, można po prostu wziąć pierwszą 50.

przeciwnym razie użyj

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) 
+0

doskonały. dziękuję za wyjaśnienie też –

+3

Pamiętaj, że losowe muszą być importowane. 'import random' – jxn

13

myślę random.choice() jest lepsza opcja.

from numpy import random 

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

random.choice(mylist,3) 

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

+5

Myślę, że musisz użyć' random.choice (mylist, 3, replace = False) '. Również mniej mylące jest użycie 'import numpy jako np' i' np.random.choice (mylist, 3, replace = False) ' –

+0

To ma szanse na powtórzenie pozycji listy – Paullo

7

Prostym sposobem, aby wybrać losowo elementów jest shuffle następnie plaster.

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

niedoceniana odpowiedź tutaj imho –

+0

@MonicaHeddneck Dlaczego losowe tasowanie a krojenie będzie lepsze? Czy wybranie liczby próbek przez losowanie selekcji nie ma takich samych zalet jak losowe tasowanie, a następnie pobranie kawałka przetasowanych próbek? Czy możesz wyjaśnić? Dzięki. – salvu

+2

Użyłem tego, aby łatwo utworzyć zestaw testowy/kolejowy dla projektu uczenia maszynowego. Użycie 'random.choice (mylist, 3)' nie spowodowałoby utworzenia dwóch rozłącznych zestawów. –

Powiązane problemy