Permalänk
Medlem

Problem med else/for [Python]

Hej!

Jag får inte till min kod riktigt, någon som kan se något uppenbart fel i den?
Jag har definerat en funktion som matchar my_fisk med uppslagsverket jag slår mot,och lägger till i en egen lista. Den fungerar som den ska.
Problemet är när den inte matchar så ska den lägga till den my_fisk i listan ingen_hittad.

for my_fisk in my_fisks: match = 0 print "Letar efter '%s'\n" % (my_fisk), data = gofish.searchfisk(my_fisk) if data['antal_fiskar'] > 0: for r in data['fiskar']: if not match == 1: try: match = check_fish(r["fisk"],my_fisk) except Exception, e: error = "ingen fisk" else: ingen_hittad.append(my_fisk)

Någon som kan se vad som är fel?

Visa signatur

.

Permalänk
Medlem
Skrivet av Quack:

Någon som kan se vad som är fel?

Det ser ut om som du tabbat in else-blocket för långt. Förresten, borde du inte matcha mot fisk innan du kör din if-sats?

Visa signatur

Kom-pa-TI-bilitet

Permalänk
Medlem
Skrivet av Teknocide:

Det ser ut om som du tabbat in else-blocket för långt. Förresten, borde du inte matcha mot fisk innan du kör din if-sats?

Så du menar att det borde vara såhär istället?

for my_fisk in my_fisks: match = 0 print "Letar efter '%s'\n" % (my_fisk), data = gofish.searchfisk(my_fisk) match = check_fish(r["fisk"],my_fisk) if data['antal_fiskar'] > 0: for r in data['fiskar']: if not match == 1: try: ingen_hittad.append(my_fisk) except Exception, e: error = "ingen fisk"

Visa signatur

.

Permalänk
Medlem
Skrivet av Quack:

Så du menar att det borde vara såhär istället?

Nej

Visa signatur

Kom-pa-TI-bilitet

Permalänk
Medlem
Skrivet av Teknocide:

Lust att hjälpa till?

Visa signatur

.

Permalänk
Medlem

Du verkar ha gjort allt rätt bara en extra tabb som smugit sig in före "else:" vilket gör att "if not match == 1:" inte har någon matchande else-sats.

for my_fisk in my_fisks: match = 0 print "Letar efter '%s'\n" % (my_fisk), data = gofish.searchfisk(my_fisk) if data['antal_fiskar'] > 0: for r in data['fiskar']: if not match == 1: try: match = check_fish(r["fisk"],my_fisk) except Exception, e: error = "ingen fisk" else: <---- Denna else-sats är intabbad ett steg för mycket och matchar inte if-satsen därför. ingen_hittad.append(my_fisk)

Visa signatur

There are 10 types of people in the world: Those who understand binary, and those who don't...

Asus Maximus VIII Hero | i7-6700K | ASUS GeForce GTX1070 Strix 8GB | G.Skill F4-2133C15Q-32GRK |

Permalänk
Medlem
Skrivet av WarWolf.667:

Du verkar ha gjort allt rätt bara en extra tabb som smugit sig in före "else:" vilket gör att "if not match == 1:" inte har någon matchande else-sats.

Hade fel, koden är rörig. Det som händer är att ingen_hittad aldrig får en fisk eftersom testet sker inuti if-satsen som kollar om my_fisk är en fisk.

Skrivet av Quack:

Lust att hjälpa till?

Du kan inte testa r["fisk"] när du inte har något r än.

Visa signatur

Kom-pa-TI-bilitet

Permalänk
Medlem
Skrivet av Teknocide:

Hade fel, koden är rörig. Det som händer är att ingen_hittad aldrig får en fisk eftersom testet sker inuti if-satsen som kollar om my_fisk är en fisk.

Du kan inte testa r["fisk"] när du inte har något r än.

Sorry, blev ett litet fel från min sida.
När jag kör denna kod lägger den till de fiskar den inte hittar (typ om jag skriver kyckling) i ingen_hittad .
Dock så matchar den inte längre fiskar via funktionen check_fisk och lägger till en annan lista som vi kan kalla hittade_fiskar. Någon idé varför?

for my_fisk in my_fisks: match = 0 print "Letar efter '%s'\n" % (my_fisk), data = gofish.searchfisk(my_fisk) if data['antal_fiskar'] > 0: for result in data['fiskar']: if not match == 1: try: match = check_fish(result["fisk"],my_fisk) except Exception, e: error = "ingen fisk" else: ingen_hittad.append(my_fisk)

Visa signatur

.

Permalänk
Medlem
Skrivet av Quack:

Sorry, blev ett litet fel från min sida.
När jag kör denna kod lägger den till de fiskar den inte hittar (typ om jag skriver kyckling) i ingen_hittad .
Dock så matchar den inte längre fiskar via funktionen check_fisk och lägger till en annan lista som vi kan kalla hittade_fiskar. Någon idé varför?

Det är den frågan vi har besvarat ovan: Du har fortfarande tabbat in else-satsen för långt, och du tilldelar fortfarande match ett värde inuti det if-block som kontrollerar matchs värde.

Visa signatur

Kom-pa-TI-bilitet

Permalänk
Medlem
Skrivet av Teknocide:

Det är den frågan vi har besvarat ovan: Du har fortfarande tabbat in else-satsen för långt, och du tilldelar fortfarande match ett värde inuti det if-block som kontrollerar matchs värde.

Ok. Var någonstans bör match bli tilldelad ett värde, precis innan if-blocket?

Visa signatur

.

Permalänk
Medlem

matchande_fiskar = [my_fisk for my_fisk in data['fiskar'] if check_fish(my_fisk, result["fisk"]) ]
ej_matchande_fiskar =[my_fisk for my_fisk in data['fiskar'] if not check_fish(my_fisk, result["fisk"]) ]

om du ser till att check_fish inte kastar något fel dvs. flytta in try-catch i den metoden och om det blir exception så returnerar du False.
Alternativt så kan du t.ex. returnera 0 för ingen match, 1 för match och 2 för exception och göra:

matchande_fiskar = [my_fisk for my_fisk in data['fiskar'] if check_fish(my_fisk, result["fisk"]) == 1 ]
ej_matchande_fiskar =[my_fisk for my_fisk in data['fiskar'] if check_fish(my_fisk, result["fisk"]) == 0 ]
ej_fiskar = [my_fisk for my_fisk in data['fiskar'] if check_fish(my_fisk, result["fisk"]) == 2 ]

tror det ska fungera ... har dock inte testat

Visa signatur

weeeee

Permalänk
Medlem
Skrivet av mounte:

matchande_fiskar = [my_fisk for my_fisk in data['fiskar'] if check_fish(my_fisk, result["fisk"]) ]
ej_matchande_fiskar =[my_fisk for my_fisk in data['fiskar'] if not check_fish(my_fisk, result["fisk"]) ]

om du ser till att check_fish inte kastar något fel dvs. flytta in try-catch i den metoden och om det blir exception så returnerar du False.
Alternativt så kan du t.ex. returnera 0 för ingen match, 1 för match och 2 för exception och göra:

matchande_fiskar = [my_fisk for my_fisk in data['fiskar'] if check_fish(my_fisk, result["fisk"]) == 1 ]
ej_matchande_fiskar =[my_fisk for my_fisk in data['fiskar'] if check_fish(my_fisk, result["fisk"]) == 0 ]
ej_fiskar = [my_fisk for my_fisk in data['fiskar'] if check_fish(my_fisk, result["fisk"]) == 2 ]

tror det ska fungera ... har dock inte testat

Hur menar du att detta ska ligga i koden? Sorry, noob här

Visa signatur

.

Permalänk
Medlem
Skrivet av Quack:

Ok. Var någonstans bör match bli tilldelad ett värde, precis innan if-blocket?

Du måste självklart ha värdet innan du testar det.

Visa signatur

Kom-pa-TI-bilitet

Permalänk
Medlem

Lite mer kod kring testet...

import random data = {} data['fiskar'] = ['fisk %d' % random.randint(0,5) for i in range(20)] data['antal_fiskar'] = len(data['fiskar']) def check_fish(fish1, fish2): try: if fish1==fish2: return 1 else: return 0 except: return 2 pass my_fisks = ['fisk 0','fisk 1','fisk 2','fisk 3'] print "Try to match fishes: %s" % str(my_fisks) print "with the following: %s" % str(data['fiskar']) for my_fisk in my_fisks: matches = [fish for fish in data['fiskar'] if check_fish(fish, my_fisk) == 1 ] nomatches = [fish for fish in data['fiskar'] if check_fish(fish, my_fisk) == 0 ] nofish = [fish for fish in data['fiskar'] if check_fish(fish, my_fisk) == 2 ] print "%s matches the following: %s" % (my_fisk, matches) print "%s does NOT match the following: %s" % (my_fisk, nomatches) print "%s does NOT match the following (no fish): %s" % (my_fisk, nofish)

Visa signatur

weeeee