Pilih 50 item dari daftar secara acak untuk menulis ke file

129

Sejauh ini saya telah menemukan cara untuk mengimpor file, membuat file baru, dan mengacak daftar.

Saya mengalami masalah dalam memilih hanya 50 item dari daftar secara acak untuk menulis ke file?

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

Jadi jika total file pengacakan itu

example:

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

Saya ingin 3 file (out_file1 | 2 | 3) dengan set acak pertama 3, set acak kedua 3, dan set acak ketiga 3 (untuk contoh ini, tetapi yang ingin saya buat harus memiliki 50)

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

Jadi '4' terakhir tidak akan termasuk yang baik-baik saja.

Bagaimana saya bisa memilih 50 dari daftar yang saya acak?

Lebih baik lagi, bagaimana saya bisa memilih 50 secara acak dari daftar asli?

O.rka
sumber
maksud kamu apa?
O.rka

Jawaban:

269

Jika daftar ini dalam urutan acak, Anda bisa mengambil 50 yang pertama.

Kalau tidak, gunakan

import random
random.sample(the_list, 50)

random.sample teks bantuan:

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
sumber
1
Bisakah saya random.samplemengembalikan indeks yang telah dipilih?
zyy
43

Salah satu cara mudah untuk memilih item acak adalah dengan mengocok lalu mengiris.

import random
a = [1,2,3,4,5,6,7,8,9]
random.shuffle(a)
print a[:4] # prints 4 random variables
Mani
sumber
@MonicaHeddneck Mengapa pengocokan acak dan pemotongan menjadi lebih baik? Tidakkah memilih sejumlah sampel dengan mengacak pilihan memiliki manfaat yang sama dengan pengocokan acak dan kemudian mengambil sepotong sampel yang dikocok? Bisakah Anda jelaskan? Terima kasih.
salvu
7
Saya menggunakan ini untuk dengan mudah membuat set tes / kereta untuk proyek pembelajaran mesin. Menggunakan random.choice(mylist,3)tidak akan membuat dua set terpisah seperti ini.
Monica Heddneck
29

Saya pikir random.choice()ini pilihan yang lebih baik.

import numpy as np

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

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

fungsi mengembalikan array 3 nilai yang dipilih secara acak dari daftar

Moein
sumber
7
Saya pikir Anda perlu menggunakan random.choice(mylist, 3, replace=False). Juga kurang membingungkan untuk digunakan import numpy as npdannp.random.choice(mylist, 3, replace=False)
John La Rooy
10
Ini kemungkinan mengulang item daftar
Paullo
Tidak, ini bukan pilihan yang lebih baik, ini ~ 100 kali lebih lambat
nitesh kansal
-3

Katakanlah daftar Anda memiliki 100 elemen dan Anda ingin memilih 50 dari mereka secara acak. Berikut langkah-langkah yang harus diikuti:

  1. Impor perpustakaan
  2. Buat seed untuk generator angka acak, saya taruh di 2
  3. Persiapkan daftar angka untuk diambil secara acak
  4. Buat pilihan acak dari daftar angka

Kode:

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
sumber