Update Wörterbuch in einer Schleife, geht das kürzer?

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
Benutzeravatar
Dennis89
User
Beiträge: 1551
Registriert: Freitag 11. Dezember 2020, 15:13

Hallo,

ich versuche immer mal wieder kompakten Code zu schreiben. Vor allem wenn ich eine Rätselaufgabe gelöst habe, weil da kommt es mir dann nicht mehr auf die Lesbarkeit an, sondern eher um weitere Möglichkeiten kennen zu lernen. Heute morgen war wieder so was. Es geht um die Funktion `translate_crypt_to_human` ich habe im Code unten die 2 kompaktesten Lösungen drin gelassen und bin auf der Suche nach etwas kürzerem. Im Prinzip Code-Golf nur mit sprechenden Namen.

Code: Alles auswählen

EXAMPLES = [
    ("]()]|_]|_]][-]|-|]", "hello"),
    ("{|^{|{{|_{]3{", "blip"),
]


def identify_words(crypt):
    letters = [letter for letter in crypt.split(crypt[0]) if letter]
    letters.reverse()
    return letters


def translate_crypt_to_human(examples):
    return {
        crypt: letter
        for crypt_text, human in examples
        for crypt, letter in zip(identify_words(crypt_text), list(human))
    }

def translate_crypt_to_human(examples):
    crypt_to_human = {}
    for crypt_text, human in examples:
        crypt_to_human |= dict(zip(identify_words(crypt_text), list(human)))
    return crypt_to_human
    
def translate_crypt_to_human(examples):
    crypt_to_human = {}
    for crypt_text, human in examples:
        crypt_to_human.update(zip(identify_words(crypt_text), list(human)))
    return crypt_to_human


def main():
    print(translate_crypt_to_human(EXAMPLES))


if __name__ == "__main__":
    main()

Danke und Grüße
Dennis
"When I got the music, I got a place to go" [Rancid, 1993]
Sirius3
User
Beiträge: 18270
Registriert: Sonntag 21. Oktober 2012, 17:20

Was hast Du gegen die erste Variante?
`identify_words` kann man natürlich kürzer schreiben, und der list-Aufruf ist unnötig.

Code: Alles auswählen

def identify_words(crypt):
    return [
        letter
        for letter in reversed(crypt.split(crypt[0]))
        if letter
    ]

def translate_crypt_to_human(examples):
    return {
        crypt: letter
        for crypt_text, human in examples
        for crypt, letter in zip(identify_words(crypt_text), human)
    }
Natürlich in der Golf-Variante:

Code: Alles auswählen

translate_crypt_to_human=lambda e:{c:l for t,h in e for c,l in zip(identify_words(t),h)}
ist zwei Zeichen kürzer als die mittlere Variante, bei der man das dict noch weglassen könnte:

Code: Alles auswählen

def translate_crypt_to_human(e):
 r={}
 for t,h in e:r|=zip(identify_words(t),h)
 return r
Benutzeravatar
Dennis89
User
Beiträge: 1551
Registriert: Freitag 11. Dezember 2020, 15:13

Danke für die Antwort.
Ah stimmt, `reversed()` gibt's ja auch noch.

Ich habe nichts gegen die erste Variante, die hätte ich auch für einen nicht-wegwerf-Code ausgewählt. Habe mich nur gefragt, ob es noch kürzer geht. Also mal abgesehen davon, dass ich die Variablen anders benenne. Finde das bei den Code-Golf Beispielen die es hier ja ab und zu gibt, immer interessant, wie man verschiedene Probleme angehen kann.


Grüße
Dennis
"When I got the music, I got a place to go" [Rancid, 1993]
Antworten