Kezdőoldal » Számítástechnika » Programozás » Python 3 Kezdo vagyok a...

Amigdala kérdése:

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?

Figyelt kérdés

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



2019. ápr. 15. 11:18
1 2
 1/13 tabaki ***** válasza:

Egyelőre írd be egy kódmegosztó oldalra, például ide:

[link]

A GyK ugyanis nem tartja meg a behúzásokat, ami Python esetén eléggé kellemetlen.

2019. ápr. 15. 12:12
Hasznos számodra ez a válasz?
 2/13 A kérdező kommentje:

OK, koszi, rajta vagyok.

Tenyleg eltunt az osszes behuzas egy ido utan. :(

2019. ápr. 15. 12:39
 3/13 tabaki ***** válasza:
Az Ideone oldalon ne felejtsd el beállítani, hogy Python 3-ról van szó, mielőtt berakod a kódodat. A Run gombbal ki is próbálhatod. Itt meg linkeld be a feltöltött kód címét.
2019. ápr. 15. 13:01
Hasznos számodra ez a válasz?
 4/13 A kérdező kommentje:

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?

[link]

2019. ápr. 15. 13:11
 5/13 tabaki ***** válasza:
Tökéletesen. De be kell valljam, egyelőre egy kukkot sem értek belőle (vagy max. egy kukkot), és igen sürgősen el kell indulnom itthonról. Este újra előveszem, de megeshet, hogy akkor se leszek okosabb, mint most.
2019. ápr. 15. 13:31
Hasznos számodra ez a válasz?
 6/13 A kérdező kommentje:

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.

2019. ápr. 15. 13:43
 7/13 tabaki ***** válasza:

Ööö... 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.

2019. ápr. 15. 14:23
Hasznos számodra ez a válasz?
 8/13 tabaki ***** válasza:
Ó, látom, közben írtad, hogy hasonlóra lyukadtál ki te is. Egyelőre mennem kell, este még megpróbálok küzdeni vele.
2019. ápr. 15. 14:26
Hasznos számodra ez a válasz?
 9/13 A kérdező kommentje:

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...

2019. ápr. 15. 15:13
 10/13 tabaki ***** válasza:

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.

2019. ápr. 15. 22:41
Hasznos számodra ez a válasz?
1 2

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

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!