vereinfachen + frage zu random

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
py-mule
User
Beiträge: 58
Registriert: Samstag 3. Januar 2009, 10:42

Hallo,
wie kann ich den Abschnitt in def auswahl(): mit den vielen if und elif vereinfachen? Gibt es etwas, womit ich das kompakter ausführen kann?

Wie kann man für den markierten Fall "elif laenge1 != 0 and laenge2 == 0 and laenge3 != 0" Werte für random so übergeben, daß random nur Zufälle von 1-7 und 10 auswählt. 8 und 9 sollen dann nicht vorkommen.

Das geht mit random.randrange wahrscheinlich nicht, oder?
Wie kann es funktionieren?

Code: Alles auswählen

import random

laenge1 = random.randrange(0, 2)
laenge2 = random.randrange(0, 2)
laenge3 = random.randrange(0, 2)
print 'Kontrollausgabe laenge1 = %d' %laenge1
print 'Kontrollausgabe laenge2 = %d' %laenge2
print 'Kontrollausgabe laenge3 = %d' %laenge3
auswahl()

def auswahl():

    if laenge1 == 0 and laenge2 == 0 and laenge3 == 0:
        u_grenze = 0
        o_grenze = 1

    # eine laenge ist ungleich null
    elif laenge1 != 0 and laenge2 == 0 and laenge3 == 0:
        u_grenze = 1
        o_grenze = 7
        
    elif laenge1 == 0 and laenge2 != 0 and laenge3 == 0:
        u_grenze = 7
        o_grenze = 10
        
    elif laenge1 == 0 and laenge2 == 0 and laenge3 != 0:
        u_grenze = 10
        o_grenze = 11

    # zwei laengen sind ungleich 0
    elif laenge1 != 0 and laenge2 != 0 and laenge3 == 0:
        u_grenze = 1
        o_grenze = 10

    elif laenge1 == 0 and laenge2 != 0 and laenge3 != 0:
        u_grenze = 7
        o_grenze = 11

################################################################################        
# hier ist es noch kritisch, wenn laenge2 == 0 ist kann das mit random.randrange
# nicht beschrieben werden, oder?
        
    elif laenge1 != 0 and laenge2 == 0 and laenge3 != 0:
        u_grenze = 1  # soll sein 1 -7
        o_grenze = 11 #soll sein 10 - 11

################################################################################
    # in allen 3 f-Ordnern befindet sich eine f.txt Datei

    elif laenge1 != 0 and laenge2 != 0 and laenge3 != 0:
        u_grenze = 1
        o_grenze = 11

    print 'Kontrollausgabe: o_grenze in steuerung(o_grenze, u_grenze): = %d' %o_grenze
    print 'Kontrollausgabe: u_grenze in steuerung(o_grenze, u_grenze): = %d' %u_grenze

    z_zahl = random.randrange(u_grenze, o_grenze)
    print 'z_zahl = %d\n' %z_zahl
    return z_zahl
Gruß
py-mule
Darii
User
Beiträge: 1177
Registriert: Donnerstag 29. November 2007, 17:02

Grundsätzlich werden in Python Nullen als „falsch“ und alle anderen Zahlen als „wahr“ ausgewertet. Sprich man kann

Code: Alles auswählen

if laenge1 == 0 and laenge2 == 0 and laenge3 == 0:
als

Code: Alles auswählen

if not laenge1 and not laenge2 and not laenge3:
schreiben. Leserlicher wäre allerdings ein:

Code: Alles auswählen

if not all((laenge1, laenge2, laenge3)):
Bei deinem Problem hilft das aber auch nicht viel, ist immer noch unübersichtlich. Kompakter ginge es mit einem Dictionary, in dem du deine Fälle hinterlegst.

Code: Alles auswählen

optionen = {
    (0, 0, 0): (0, 1),
    (1, 0, 0): (1, 7),
    # ...
}
try: 
    u_grenze, o_grenze = optionen[(laenge1, laenge2, laenge3)]
except KeyError:
    # deine Sonderfallbehandlung
Deinen Sonderfall könntest du mit einem random.choice behandeln.

Edit: Ups, ja man kann die Zahlen ja auch direkt einsetzen...
Zuletzt geändert von Darii am Freitag 26. Juni 2009, 22:41, insgesamt 3-mal geändert.
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

Das macht in etwa das gleiche wie dein Code, wobei ich den Sinn nicht so recht verstehe und zumindest so etwas wie randrange(0,1) oder randrange(10,11) nochmal überdacht werden sollte .. :wink:

Code: Alles auswählen

from random import choice, randrange

case = {(0,0,0):[0], (1,0,0):range(1,7), (0,1,0):range(7,10),
        (0,0,1):[10], (1,1,0):range(1,10), (0,1,1):range(7,11),
        (1,0,1):range(1,7)+[10], (1,1,1):range(1,10)}

l1, l2, l3 = randrange(0,2), randrange(0,2), randrange(0,2)
print choice(case[(l1,l2,l3)])
py-mule
User
Beiträge: 58
Registriert: Samstag 3. Januar 2009, 10:42

Vielen Dank,

mit random.choice funktioniert es prima.

Gruß
py-mule
Antworten