Як реалізувати умовне форматування рядків?


80

Я працював над текстовою грою на Python, і я натрапив на екземпляр, коли я хочу відформатувати рядок по-різному на основі набору умов.

Зокрема, я хочу відобразити текст із описом предметів у кімнаті. Я хочу, щоб це відображалося в описі кімнати тоді і тільки тоді, коли предметний предмет, про який йде мова, є в списку предметів предметного приміщення. Я вважаю, що просто об'єднання рядків на основі умов не виводить, як я хочу, і було б краще мати різний рядок для кожного випадку.

Моє питання полягає в тому, чи існує якийсь пітонічний метод форматування рядків на основі результату логічного умовного? Я міг би використовувати структуру циклу for, але мені було цікаво, чи є щось простіше, подібне до виразу генератора.

Я шукаю щось подібне до цього, у формі рядків

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

Як загальний приклад того, що я маю на увазі:

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

Я розумію, що цей приклад не є дійсним Python, але загалом показує, що я шукаю. Мені цікаво, чи існує якийсь дійсний вираз для булевого форматування рядка, подібний до вищезазначеного. Трохи розшукавши, мені не вдалося знайти нічого, що стосується конкретно форматування умовного рядка. Я знайшов кілька дописів про форматування рядків загалом, але це не те, що я шукаю.

Якщо щось подібне справді існує, це було б дуже корисно. Я також відкритий для будь-яких альтернативних методів, які можуть бути запропоновані. Заздалегідь дякуємо за будь-яку допомогу, яку ви можете надати.


4
якщо видалити кому та крапку з комою, це стане дійсним python
yurib

Відповіді:


116

Ваш код насправді є дійсним Python, якщо ви видалите два символи, кому і двокрапку.

>>> 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.

Однак використання більш сучасного стилю .format:

>>> 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."

де аргументом форматування може бути a dictви будуєте будь-яку складність, яка вам подобається.


s = "Принаймні, так мені сказав {займенник}.". формат (займенник = ["вона", "він"] [стать == "чоловік"])
Jung-Hyun

Чи можна тут втиснути еліф? наприклад формат (займенник = "він", якщо стать == "чоловічий" займенник = "вона" еліф гендер == "жіночий" ще "не знайдено")
HVS

Відповідь працює лише для одного оператора if else, коли я додав ("/{tech}".format(tech='w 'if portfolio ==' onshore 'else' s 'if portfolio ==' solar '), я отримую invalidSyntax Помилка
mk_sch

@HVS можливо, див. Цю відповідь щодоelseifelif набору рядків / операторів, щоб імітувати вбудований рядок . Але насправді не слід, натомість слід визначити функцію.
Борис

33

На Python 3.6+ використовуйте відформатований рядковий літерал (вони називаються f-strings: f"{2+2}"produce "4") із ifтвердженням:

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

Ви не можете використовувати зворотні скісні риски, щоб уникнути лапок у частині вираження f-рядка, тому вам доведеться змішувати подвійні "та одинарні 'лапки. (Ви все ще можете використовувати зворотні скісні риски у зовнішній частині f-рядка, наприклад. f'{2}\n'Це нормально)


Чудово, але що, якщо 's'це змінна?
Ахмед Хуссейн,

1
@AhmedHussein, тоді ви передаєте зміннуprint(f"Shut the door{my_variable if num_doors > 1 else ''}.")
Борис

12

У Python є умовний вираз, який приймає форму

A if condition else B

Ваш приклад можна легко перетворити на дійсний Python, опустивши лише два символи:

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

Альтернативою, яку я часто вважаю за краще, є використання словника:

pronouns = {"female": "she", "male": "he"}
print "At least, that's what %s told me." % pronouns[gender]
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.