Seite 1 von 1

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

Verfasst: Montag 30. September 2024, 13:09
von Dennis89
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

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

Verfasst: Montag 30. September 2024, 14:20
von Sirius3
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

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

Verfasst: Montag 30. September 2024, 15:25
von Dennis89
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