Seite 1 von 1

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

Verfasst: Samstag 6. Juli 2019, 17:48
von Lani
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.

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

Verfasst: Samstag 6. Juli 2019, 18:30
von __blackjack__
@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.

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

Verfasst: Samstag 6. Juli 2019, 20:03
von Lani
@_blackjack_ das wäre eine Überlegung wert. Ich schaue es mir mal an. Danke Dir für den Tip

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

Verfasst: Montag 8. Juli 2019, 10:44
von Kebap
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)

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

Verfasst: Montag 8. Juli 2019, 11:44
von __blackjack__
@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)

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

Verfasst: Dienstag 9. Juli 2019, 00:23
von Lani
👏🙏 ich danke Euch beiden. Das erspart mir jede Menge Arbeit.

Vielen Dank

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

Verfasst: Freitag 12. Juli 2019, 15:30
von __blackjack__
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()

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

Verfasst: Freitag 12. Juli 2019, 20:18
von Lani
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.