Gibt es eine schnellere Lösung (if.. Elif...)

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
Lani
User
Beiträge: 4
Registriert: Samstag 6. Juli 2019, 17:38

Hallo zusammen,

ich bin dabei ein einfaches Programm zu schreiben. Es soll eine Art Frage Maschine sein. zb. es existieren 1000 Schrauben. Diese sind von 1-1000 nummeriert.
Diese sollen in unterschiedliche Boxen (20 Boxen) verteilt werden. Ich habe mit einer if... Elif Schleife angefangen, aber dies ist sehr aufwendig.

Gibt es hier evtl. eine schnellere Lösung ? Oder wenigstens einen Tipp, wie ich Zahlen zb. 5-100 schneller schreiben kann anstatt alle 95 Varianten aufzuzählen ?

Hier mal ein Stück meines Codes, den ich bisher geschrieben habe:

Box = input("Bitte Schraubennummer 4stellig eingeben:")
if Schraubennummer == "0538":
print("Box 0154")
elif Schraubennummer == "0539":
print("Box 0154")
elif Schraubennummer == "0165":
print("Box 0165")
elif Schraubennummer == "0265":
print("Box 0165")
elif Schraubennummer == "0101" or ED == "0202" or ED == "0650" or ED == "0651" or ED == "0652" or ED == "0653" or ED == "0654" or ED == "0655" or ED == "0656" or ED == "0657" or ED == "0658" or ED == "0659" or ED == "0660" or ED == "0661" or ED == "0662"\
or ED == "0663" or ED == "0665" or ED == "0666" or ED == "0667" or ED == "0668": // HIER KÖNNTE MIR ZB EIN 0650-0668 HELFEN
print("Box 0101")
print(Box)

Das ist nur ein kleiner Teil der Liste.. ich muss jetzt aber zb. die Schrauben 401-499 auflisten und das würde ja ewig dauern... gibt es hier eine schnellere Lösung ?

vielen Dank.
Benutzeravatar
__blackjack__
User
Beiträge: 13079
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Lani: Das würde ich nicht als ``if``/``elif``-Kaskade schreiben, sondern als Datenstruktur beschreiben oder als Zeichenkette die in eine Datenstruktur geparst wird. Zum Beispiel in ein Wörterbuch das Schraubennummern auf Boxnummern abbildet. Dafür liesse sich der Code beispielsweise mit folgender Zeichenkette beschreiben: '0154: 0538, 0539; 0165: 0165, 0265; 0101: 0101, 0202, 0650-0668'.

Dafür kann man Code schreiben der das zu einem entsprechenden Wörterbuch verarbeitet.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Lani
User
Beiträge: 4
Registriert: Samstag 6. Juli 2019, 17:38

@_blackjack_ das wäre eine Überlegung wert. Ich schaue es mir mal an. Danke Dir für den Tip
Benutzeravatar
Kebap
User
Beiträge: 687
Registriert: Dienstag 15. November 2011, 14:20
Wohnort: Dortmund

Lani hat geschrieben: Samstag 6. Juli 2019, 17:48

Code: Alles auswählen

elif Schraubennummer == "0101" or ED == "0202" or ED == "0650" or ED == "0651" or ED == "0652" or ED == "0653" or ED == "0654" or ED == "0655" or ED == "0656" or ED == "0657" or ED == "0658" or ED == "0659" or ED == "0660" or ED == "0661" or ED == "0662"\
     or ED == "0663" or ED == "0665" or ED == "0666" or ED == "0667" or ED == "0668": // HIER KÖNNTE MIR ZB EIN 0650-0668 HELFEN
	print("Box 0101")
	print(Box)
Würde auch so funktionieren

Code: Alles auswählen

elif Schraubennummer == "0101" or ED == "0202" or int(ED) in range(650, 668): 
	print("Box 0101")
	print(Box)
MorgenGrauen: 1 Welt, 8 Rassen, 13 Gilden, >250 Abenteuer, >5000 Waffen & Rüstungen,
>7000 NPC, >16000 Räume, >200 freiwillige Programmierer, nur Text, viel Spaß, seit 1992.
Benutzeravatar
__blackjack__
User
Beiträge: 13079
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Kebap: Wobei man da dann darauf vertrauen müsste ob/dass `range()` hier effizient prüft und nicht linear durch die Elemente geht. Dann vielleicht doch eher:

Code: Alles auswählen

elif Schraubennummer == "0101" or ED == "0202" or '0650' <= ED <= '0668': 
	print("Box 0101")
	print(Box)
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Lani
User
Beiträge: 4
Registriert: Samstag 6. Juli 2019, 17:38

👏🙏 ich danke Euch beiden. Das erspart mir jede Menge Arbeit.

Vielen Dank
Benutzeravatar
__blackjack__
User
Beiträge: 13079
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Das mit dem Wörterbuch mal als Code:

Code: Alles auswählen

#!/usr/bin/env python3

NUMBER_FORMAT = '04d'
BOX_TO_SCREW_NUMBERS_SOURCE = (
    '0154: 0538, 0539; 0165: 0165, 0265; 0101: 0101, 0202, 0650-0668'
)


def iterparse_range(source):
    if '-' in source:
        start, _, end = source.partition('-')
        yield from (
            format(number, NUMBER_FORMAT)
            for number in range(int(start), int(end) + 1)
        )
    else:
        yield source.strip()


def parse_screw2box_mapping(source):
    screw_number2box_number = dict()
    for box_source in source.split(';'):
        box_number, colon, screws_source = box_source.partition(':')
        if not colon:
            raise ValueError(f'missing colon in {box_source!r}')

        box_number = box_number.strip()
        for part in screws_source.split(','):
            for screw_number in iterparse_range(part):
                if screw_number in screw_number2box_number:
                    raise ValueError(
                        f'screw number {screw_number!r} already mapped'
                    )
                screw_number2box_number[screw_number] = box_number
    
    return screw_number2box_number


def main():
    screw_number2box_number = parse_screw2box_mapping(
        BOX_TO_SCREW_NUMBERS_SOURCE
    )
    screw_number = input('Bitte Schraubennummer 4stellig eingeben: ').strip()
    print(f'Box {screw_number2box_number.get(screw_number, "----")}')


if __name__ == '__main__':
    main()
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Lani
User
Beiträge: 4
Registriert: Samstag 6. Juli 2019, 17:38

Das ist sehr nett von Dir blackjack. Danke 😊. Das hilft mir sehr.

Ich fange gerade erst an und arbeite mich durch den Udemy Python Bootcamp Kurs.
Antworten