Wie implementiere ich eine bedingte Zeichenfolgenformatierung?

78

Ich habe an einem textbasierten Spiel in Python gearbeitet und bin auf eine Instanz gestoßen, in der ich eine Zeichenfolge basierend auf einer Reihe von Bedingungen unterschiedlich formatieren möchte.

Insbesondere möchte ich Text anzeigen, der Elemente in einem Raum beschreibt. Ich möchte, dass dies in der Raumbeschreibung genau dann angezeigt wird, wenn sich das betreffende Objekt in der Artikelliste des Raumobjekts befindet. Bei der Einrichtung habe ich das Gefühl, dass das einfache Verketten von Zeichenfolgen basierend auf Bedingungen nicht wie gewünscht ausgegeben wird, und es wäre besser, für jeden Fall eine andere Zeichenfolge zu haben.

Meine Frage ist, gibt es eine pythonische Methode zum Formatieren von Zeichenfolgen basierend auf dem Ergebnis einer Booleschen Bedingung? Ich könnte eine for-Schleifenstruktur verwenden, aber ich habe mich gefragt, ob es etwas Einfacheres gibt, ähnlich einem Generatorausdruck.

Ich suche etwas Ähnliches in Stringform

num = [x for x in xrange(1,100) if x % 10 == 0]

Als allgemeines Beispiel für das, was ich meine:

print "At least, that's what %s told me." %("he" if gender == "male", else: "she")

Mir ist klar, dass dieses Beispiel kein gültiges Python ist, aber es zeigt im Allgemeinen, wonach ich suche. Ich frage mich, ob es einen gültigen Ausdruck für die Formatierung von booleschen Zeichenfolgen gibt, ähnlich wie oben. Nachdem ich mich ein wenig umgesehen hatte, konnte ich nichts finden, was speziell mit der Formatierung bedingter Zeichenfolgen zu tun hatte. Ich habe im Allgemeinen mehrere Beiträge zu Formatzeichenfolgen gefunden, aber das ist nicht das, wonach ich suche.

Wenn so etwas tatsächlich existiert, wäre es sehr nützlich. Ich bin auch offen für alternative Methoden, die vorgeschlagen werden können. Vielen Dank im Voraus für jede Hilfe, die Sie leisten können.

George Osterweil
quelle
4
Wenn Sie das Komma und das Semikolon entfernen, wird es gültig Python
Yurib

Antworten:

116

Ihr Code tatsächlich ist gültig Python , wenn Sie zwei Zeichen entfernen, das Komma und den Doppelpunkt.

>>> gender= "male"
>>> print "At least, that's what %s told me." %("he" if gender == "male" else "she")
At least, that's what he told me.

Modernere .formatStilanwendungen:

>>> s = "At least, that's what {pronoun} told me.".format(pronoun="he" if gender == "male" else "she")
>>> s
"At least, that's what he told me."

Dabei kann das zu formatierende Argument ein Argument sein, das dictSie in einer beliebigen Komplexität erstellen.

DSM
quelle
s = "Zumindest hat mir das {Pronomen} gesagt.". Format (Pronomen = ["sie", "er"] [Geschlecht == "männlich"])
Jung-Hyun
Ist es möglich, einen Elif hier reinzuquetschen? zB Format (Pronomen = "er" wenn Geschlecht == "männlich" Pronomen = "sie" elif Geschlecht == "weiblich" sonst "nicht gefunden")
HVS
Die Antwort funktioniert nur für eine if else-Anweisung, wenn ich sie hinzufügte ("/{tech}".format(tech='w 'if Portfolio ==' onshore 'else' s 'if Portfolio ==' solar '), ich erhalte invalidSyntax Fehler
mk_sch
@HVS Es ist möglich, siehe diese Antwort zum Aneinanderreihen else/ ifAnweisungen, um eine Inline zu simulierenelif . Aber Sie sollten es wirklich nicht, Sie sollten stattdessen eine Funktion definieren.
Boris
30

Auf Python 3.6 oder höher, ein verwenden formatiert Stringliteral (sie sind f-Strings genannt: f"{2+2}"produziert "4") mit einer ifErklärung:

print(f"Shut the door{'s' if abs(num_doors) != 1 else ''}.")

Sie können keine Backslashes verwenden , um Anführungszeichen im Ausdrucksteil einer F-Zeichenfolge zu umgehen, sodass Sie doppelte "und einfache 'Anführungszeichen mischen müssen . (Sie können immer noch Backslashes im äußeren Teil eines F-Strings verwenden, z. B. f'{2}\n'ist in Ordnung)

Boris
quelle
Großartig, aber was ist, wenn 's'es sich um eine Variable handelt?
Ahmed Hussein
1
@AhmedHussein dann übergeben Sie die Variableprint(f"Shut the door{my_variable if num_doors > 1 else ''}.")
Boris
12

In Python gibt es einen bedingten Ausdruck, der die Form annimmt

A if condition else B

Ihr Beispiel kann leicht in gültiges Python umgewandelt werden, indem nur zwei Zeichen weggelassen werden:

print ("At least, that's what %s told me." % 
       ("he" if gender == "male" else "she"))

Eine Alternative, die ich oft vorziehen würde, ist die Verwendung eines Wörterbuchs:

pronouns = {"female": "she", "male": "he"}
print "At least, that's what %s told me." % pronouns[gender]
Sven Marnach
quelle