Hogy lehet megoldani egy ilyen feladatot Pythonban?
Van egy x elemből álló lista, belőle ki kell választani véletlenszerűen 10 elemet, nem ismétlődhetnek, de lehetőséget kell adni arra, hogy minden listában tárolt elemnek lehetősége legyen kiválasztódni a 10-be. Ezzel a kóddal próbálkoztam: lényeg: egy set-es listát létrehozok, generáltatok o-tól az eredeti lista hosszával megegyező határon belül random számokat, amit szintén egy listában tárolok el. Majd for ciklussal 10szer adnám hozzá az eredeti listának a a "generált változódik" tagját,azonban itt problémázik, hogy"'set' object is not subscriptable". Ami gondolom azt jelenti,hogy set-es lista nem használható típusváltozóként. sima listával megy, azonban ott meg a generált változók ismétlődhetnek, és ennek következtében a kiválasztott elemek is ismétlődhetnek, ami viszont nem jó. Mi a probléma megoldása?
Kód:valtozok=set()
feladat10=[]
for i in range(10):
valtozok.add(random.randrange(0,len(feladatok)))
print(valtozok)
for i in range(10):
feladat10.add(feladatok[valtozok[i]])
print(feladat10
# 100 random szam 0 es 1000 kozott. A set miatt lehet, hogy nem lesz 100 elem:
lista = set([random.randint(0,1000) for x in range(100)])
# Random kivalasztunk a listabol 10et:
random.choices(lista, k=10)
Oh, ez nem jo. A choices visszatevéses. :D
Lehet kétféle megoldás viszont:
import numpy as np
lista = list(set([random.randint(0,1000) for x in range(100)]))
x =np.random.choice(lista, size=20, replace=False)
Vagy:
random.shuffle(lista)
lista[:10]
A 2-es megoldása csak akkor működik, ha lehetnek ismétlődő elemek. A random.sample viszont ismétlődés nélkül választ. A random.sample(elemek, 10) működni fog.
De hogy értsd, mi a probléma a kódoddal. A "set object is not subscriptable" nálad annyit jelent, hogy nem tudsz megadni neki a setnek egy indexet a [] közé, mint egy listának. Ha egyedi listára van szükséged, akkor először alakítsd a listádat set-té, hogy egyedi elemek legyenek, majd vissza listává: list(set(valami)).
A for i in range(10): valtozok.add(random.randrange(0,len(feladatok))) nem fog neked 10 egyedi random számot adni. Ha újra kiválaszt egyet ami már volt, akkor nem ad hozzá újat, hiszen a set már tartalmazza.
A primitív megoldás (amit nem árt tudni, ha nem jut eszedbe rá egy beépített függvény vagy egyszerűbb mód) az, hogy egy while ciklusban addig adogatod hozzá az újabb elemeket (és nem feltétlenül az indexeket, dolgozhatsz az elemekkel is) a választottakhoz, amíg meg nem lesz a 10 egyedi elem. Ha listát használsz a gyűjteményedhez, a hozzáadás előtt persze mindig ellenőrzöd, hogy az új választás már volt-e korábban (if v not in valasztott):
elemek = [chr(c) for c in range(65, 76)] # példa elemek
valasztott = set()
while len(valasztott) < 10:
__v = elemek[random.randrange(len(elemek))]
__valasztott.add(v)
(Az aláhúzás most a behúzást helyettesíti)
További kérdések:
Minden jog fenntartva © 2024, www.gyakorikerdesek.hu
GYIK | Szabályzat | Jogi nyilatkozat | Adatvédelem | Cookie beállítások | WebMinute Kft. | Facebook | Kapcsolat: info(kukac)gyakorikerdesek.hu
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!