0

Eine eher pythische Art, das Folgende zu tun? In diesem Beispiel versuche ich, Kommentare (ein dict) als Schlüssel-Wert-Paare zu erstellen, wobei der Schlüssel die unmodifizierte Version ist und der Wert der Rückgabewert einer Funktion ist, bei der der Schlüssel als Argument übergeben wurde.Listenverständnis, aber für Wörterbücher?

def func(word): 
    return word[-1:-6:-1].upper() 

subs = { 
    'ALLOWED': ['one', 'two'], 
    'DISALLOWED': ['three', 'four'] 
} 

comments = {} 
for sub in subs['ALLOWED']: 
    # reverse and uppercase 
    comments[sub] = func(sub) 

print(comments) 

Wer hat eine Empfehlung? Es ist nicht unbedingt wichtig, dass dies erledigt ist, aber ich liebe es, Python-Idiome zu lernen und meinen Code pythonischer zu gestalten. Vielen Dank!

Antwort

4

Verwenden Sie ein dict comprehension stattdessen Ihr Wörterbuch in einer for Schleife zu bauen:

comments = {key: func(key) for key in subs['ALLOWED']} 
+1

Alternativ Verständnis für integrierte Vermeidung -ins: 'dict (zip (subs ['ALLOWED'], Karte (func, subs ['ALLOWED'])))' Nein, nicht mehr Pythonic, nur eine Option. Ich denke, ich würde das Verständnis im wirklichen Leben bevorzugen, weshalb dies keine Antwort ist. :-) – ShadowRanger

+0

@ShadowRanger überhaupt nicht schlecht. Obwohl es für diesen speziellen Anwendungsfall keinen großen Unterschied machen würde, denke ich, dass Ihre Version besser sein wird als meine (obwohl ich noch nicht getestet habe). Obwohl, wie Sie sagten, sicherlich nicht mehr Python;) – elethan

+0

Yar. Mein Haupteinwand gegen meine "Lösung" ist, dass es gegen DRY verstößt (es sieht zweimal "ERLAUBT" aus); Für kleine Inputs wird Ihr Spiel definitiv gewinnen, meins ist vielleicht ein Tick schneller für riesige Inputs, aber es ist wahrscheinlich irrelevant. – ShadowRanger

0

die Schleife entfernen und es innerhalb der Funktion mit einem Wörterbuch Verständnis ersetzen. Dann können Sie es einfach zurückgeben.

Auch können Sie die Zeichenfolge word mit [::-1] umkehren, nicht der Komplex [-1:-6:-1] slice Sie verwenden:

def func(words): 
    return {word: word[::-1].upper() for word in words} 

Daraus ergibt sich das gleiche:

comments = func(subs['ALLOWED']) 
print(comments) 
# {'two': 'OWT', 'one': 'ENO'}