Python 3 Kezdo vagyok a programozasban es nagyon elakadtam egy resznel. Orommel vennek epito jellegu segitseget. Ez a pelda jobban le tudja irni a dolgot, mint en. A gond az utolso sornal jelentkezik. Esetleg valami spec. Builtin-re lenne szuksegem?
import time
class Player:
def __init__(self):
self.location = 'a2'
class Zonemap:
def __init__(self, name, opt, descr, solved):
self.name = name
self.opt = opt
self.descr = descr
self.solved = solved
my_player = Player()
a1 = Zonemap('Entrance', ('a2', '', '', '', '', ''), 'Description of the Entrance', False)
a2 = Zonemap('Stairs', ('a3', 'a1', '', '', '', ''), 'Description of the Stairs', False)
a3 = Zonemap('Corridor', ('a4', 'a2', 'a7', '', '', ''), 'Corridor descr.', False)
flat1 = (a1, a2, a3)
print(f"My player's location is: {my_player.location}")
print(f'This would be the destination when I go north: {flat1[1].opt[0]}')
print(f"So I tried to work myself up to the point: {flat1[flat1.index(a2)].opt[0]}")
print(f"But I get this error message at the next step:\nValueError: tuple.index(x): x not in tuple\nAnd I have no idea "
f"why. The value of my_player.location is still a2.")
time.sleep(5)
print(flat1[flat1.index(my_player.location)].opt[0])
Egyelőre írd be egy kódmegosztó oldalra, például ide:
A GyK ugyanis nem tartja meg a behúzásokat, ami Python esetén eléggé kellemetlen.
OK, koszi, rajta vagyok.
Tenyleg eltunt az osszes behuzas egy ido utan. :(
Szia tabaki!
Ugy tunik, az Ideone nem szereti a formazott sorokat. Ha azt kiszedem a print sorokbol, ugyanazt a hibakodot kapom.
"ValueError: tuple.index(x): x not in tuple"
Pedig csak a fix a2 erteket akarom atallitani my_player.location-re, ami pedig szinten a2.
Tehat, ez a sor meg mukodik:
print(flat1[flat1.index(a2)].opt[0])
Viszont ez mar nem:
print(flat1[flat1.index(my_player.location)].opt[0])
Probaltam mar uj valtozot beiktatni a my_player.location ertekevel (x = my_player.location), de az sem hasznal.
Meg tudod nezni errol a linkrol?
Nem gond, azert koszi szepen.
En mar otodik napja ulok a problema felett.
Egyetlen otletem, hogy a2 egy string, es azzal mukodik, de my_player.location egy Class objektum egy eleme es valahogy maskepp kene behivni az erteket, hogy ne omoljon ossze a program.
Ööö... Lehet, hogy a kapkodásom miatt teljesen félreértem a problémát, de úgy tűnik, a
flat1[flat1.index(a2)].opt[0]
kifejezésben szereplő a2 egy Zonemap objektumot jelent, míg a
flat1[flat1.index(my_player.location)].opt[0]
kifejezésben lévő my_player.location nem egy Zonemap, hanem egyszerűen az 'a2' string.
Vegre osszejott. Nem a legelegansabb megoldassal, de mukodik. Ha meg erdekel, atdumalhatjuk este, ha leszel.
Vegul is csinaltam meg egy ugyanolyan listat, mint lakas1, csak azt stringekbol, annak kertem le a my_player.location indexet es azt a szamot egy valtozohoz rendeltem, amit mar el tudok erni az eredeti lakas1-bol.
A mi kis chatunk segitett.
Uristen, ha belegondolok, hogy 5 napig oszultem felette...
Meg kell mondjam, én még mindig csak kínlódom, mert egyelőre mindössze sejtéseim vannak a szándékodról.
A hiba oka mindenesetre már világosabb. Megpróbálom elemezni, hogy mit akarsz kiíratni a problémás sorban. Először nézzük a működő változatot (print nélkül, csak a kifejezés):
flat1[flat1.index(a2)].opt[0]
A kérdéses flat1 egy tuple, amelyik 3 elemet tartalmaz, nevezetesen az általad kreált Zonemap típusú a1, a2, a3 objektumokat. Te az a2 nevűnek az opt[0] tulajdonságára vagy kíváncsi. Mivel ezeket az elemeket tetszés szerinti sorrendben berakhattad volna a tuple-ba, ahhoz, hogy indexeléssel hivatkozhass rá, először tisztáznod kell, hogy a2 hányadik a sorban. Ezt kérdezed le a tuple index() függvényével, ez esetben így:
flat1.index(a2)
A jelentése: flat1 a2 nevű elemének sorszáma. Ez esetünkben 1, tehát a fenti kifejezés a flat1 tuple 1-gyel sorszámozott (vagyis a nulláról kezdés miatt a második) elemének opt[0] mezőjét jelenti:
flat1[1].opt[0]
Vagy visszafordítva: Melyik is a flat1[1] elem? Az a2 objektum, tehát a2 sorszámát a flat1 indexeként használva magát a2-t célzod meg.
Ezek alapján érthető, miért nem működik a flat1[flat1.index(my_player.location)].opt[0] kifejezés: A flat1-ben található my_player.location elem sorszámát keresed, csakhogy ilyen nevű elemet nem is raktál bele. Innentől borul az egész, a hiányzó elemnek nincs sorszáma, meg hát mit is indexelnél vele...
Érdekességként javaslom, hogy mégiscsak csapd hozzá a tuple-hoz:
flat1 = (a1, a2, a3, my_player.location)
Persze, hogy hibaüzenet lesz a vége, de már másik: Az index(my_player.location) kifejezés ugyanis értelmet kapott (az értéke 3), vagyis ezt az elemet is elérheted, a probléma csak annyi, hogy ez a -- programbéli formájában: flat1[flat1.index(my_player.location)] -- elem egy közönséges string, amely ennek megfelelően nem tartalmaz opt nevű attribútumot.
Gyanúm egyébként, hogy a te említett megoldásodnál valóban van egyenesebb is, amelyben my_player.location valószínűleg egy szimpla egész számként tartaná számon flat1 aktuális indexét, a kiíratás pedig ilyesmi lenne:
print(flat1[my_player.location].opt[0])
...de pont ez az, amit nem látok át ebből a programrészletből. Nyilván nem a kiírás a végcél, hanem az my_player.location-nek megfelelő terepről lehetne átjutni egy másikra, amelynek az indexét vissza kéne írni bele, stb., ám ez már sajnálatos módon ködbe vész a számomra.
Kapcsolódó 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!