Как реализовать условное форматирование строки?

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

В частности, я хочу отображать текст, описывающий элементы в комнате. Я хочу, чтобы это отображалось в описании комнаты, если и только если рассматриваемый предмет объекта находится в списке предметов объекта комнаты. Как он настроен, я чувствую, что просто конкатенация строк на основе условных выражений не будет выводиться так, как я хочу, и было бы лучше иметь другую строку для каждого случая.

Мой вопрос в том, есть ли какой-нибудь pythonic метод форматирования строк на основе результата булева условного выражения? Я мог бы использовать структуру for loop, но мне было интересно, было ли что-то проще, подобно выражению генератора.

Я ищу что-то подобное этому в строковой форме

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

Как общий пример того, что я имею в виду:

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

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

Если что-то подобное действительно существует, это было бы очень полезно. Я также открыт для любых альтернативных методов, которые могут быть предложены. Заранее благодарим за любую помощь, которую вы можете предоставить.

Ответ 1

Фактически ваш код действителен Python, если вы удалите два символа, запятую и двоеточие.

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

Более современный стиль использует .format, хотя:

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

где аргумент в формате может быть dict, который вы создаете в любой сложности.

Ответ 2

В Python есть условное выражение, которое принимает форму

A if condition else B

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

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

Альтернативой, которую я часто предпочитаю, является использование словаря:

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

Ответ 3

В Python 3. 6+ используйте форматированный строковый литерал formatted string literal (они называются f-strings: f"{2+2}" создает "4") с оператором if:

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

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