Kezdőoldal » Számítástechnika » Programozás » Hogy lehet megoldani egy...

Hogy lehet megoldani egy ilyen feladatot Pythonban?

Figyelt kérdés

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


2020. dec. 19. 20:29
 1/5 anonim ***** válasza:
Nem értek a Python-hoz. Így kérdem: nem lehet benne létrehozni egy array-t a változóknak, mint C-ben? Abban nagyon egyszerűen el lehet tárolni a kívánt értékeket.
2020. dec. 19. 20:39
Hasznos számodra ez a válasz?
 2/5 anonim ***** válasza:
100%

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

2020. dec. 19. 21:07
Hasznos számodra ez a válasz?
 3/5 anonim ***** válasza:
100%

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]

2020. dec. 19. 21:21
Hasznos számodra ez a válasz?
 4/5 anonim ***** válasza:

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)

2020. dec. 19. 21:22
Hasznos számodra ez a válasz?
 5/5 A kérdező kommentje:
Utolsó köszönöm!
2020. dec. 19. 22:37

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

A weboldalon megjelenő anyagok nem minősülnek szerkesztői tartalomnak, előzetes ellenőrzésen nem esnek át, az üzemeltető véleményét nem tükrözik.
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!