6 Stimmen

Python Wörterbuch Unverständnis

(Entschuldigung, konnte dem Wortspiel nicht widerstehen!)

Ich frage mich, warum es anscheinend nicht möglich ist, zu übersetzen:

dict([(str(x),x) if x % 2 else (str(x),x*10) for x in range(10)])

in diesen lesbareren Ausdruck mithilfe der Dictionary-Abstraktion zu übersetzen:

{str(x):x if x % 2 else str(x):x*10 for x in range(10)}

8voto

georg Punkte 205206
{ str(x):(x if x % 2 else x*10) for x in range(10) }

scheint gut zu funktionieren

1voto

lvc Punkte 32687

Die Priorität wird so gesetzt, dass das if .. else nicht auf das gesamte key:value-Paar angewendet wird: Es ist nur Teil des Werts. Das bedeutet, dass du möchtest:

{str(x): (x if x % 2 else x*10 for x in range(10))}

Falls du in seltenen Fällen eine unterschiedliche Schlüsselberechnung sowie einen unterschiedlichen Wert wünschen würdest, müsstest du es folgendermaßen tun:

{(str(x) if x % 2 else repr(x)) : x if x % 2 else x * 10 }

was gleichbedeutend wäre mit:

dict([(str(x),x) if x % 2 else (repr(x),x*10) for x in range(10)])

Oder entscheide dich dafür, dass eine explizite Schleife lesbarer ist als ein Einzeiler für etwas so Komplexes.

1voto

Jake Biesinger Punkte 5008

Sieht so aus, als ob es nur darauf ankommt, Ausdrücke richtig zu gruppieren:

# original
{str(x): (x if x % 2 else x*10) for x in range(10)}

# etwas komplexer, so dass sowohl Schlüssel als auch Wert den ternären Operator haben können
{(str(x) if x % 3 else str(x+1)) : (x if x % 2 else x*10) for x in range(10)}

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X