如何实现条件字符串格式化?

104

我正在使用Python开发一个基于文本的游戏,并且遇到了一个情况,我想根据一组条件以不同的格式来显示字符串。

具体而言,我想在描述房间时显示描述房间中物品的文本,但仅当所讨论的物品对象在该房间对象的物品列表中时才显示。按照现有的方式,我认为仅仅基于条件串联字符串并不能输出我想要的结果,最好为每种情况设置不同的字符串。

我的问题是,是否有一种Pythonic的方法可以根据布尔条件的结果来格式化字符串?我可以使用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
3个回答

139
如果您删除逗号和冒号,您的代码实际上就是有效的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."

在编程中,format函数的参数可以是你自己构建的任何复杂度的dict


1
s = "至少,那是{pronoun}告诉我的。".format(pronoun=["她","他"][gender == "male"]) - Jung-Hyun
这里能否加一个elif呢?例如:format(pronoun="he" if gender == "male" else "she" if gender=="female" else "not found") - HVS
当我添加了("/{tech}".format(tech='w' if portfolio=='onshore' else 's' if portfolio=='solar')时,答案仅适用于一个if else语句,我得到了invalidSyntax错误。 - mk_sch
@HVS 可以实现,参见这个回答中将 else/if 语句串联起来模拟内联 elif。但你真的不应该这样做,而是应该定义一个函数。 - user3064538

62
使用一个f-string
plural = ''
if num_doors != 1:
    plural = 's'

print(f'Shut the door{plural}.')

或者用一个条件表达式if/else语句的一行版本)来表示:
print(f'Shut the door{"s" if num_doors != 1 else ""}.')

请注意,在 Python 3.12 之前,您必须混合使用双引号(")和单引号('),因为在 f-string 的表达式部分中无法使用反斜杠来转义引号。但是,在 f-string 的外部部分仍然可以使用反斜杠,所以 f'{2+2}\n' 是可以的。

1
很棒,但如果s是一个变量呢? - Ahmed Hussein
3
@AhmedHussein,这里传递了变量print(f"Shut the door{my_variable if num_doors > 1 else ''}.") - user3064538
我不得不亲自搞清楚这个问题 - 看起来,由于您将其作为条件值进行设置,因此必须有 else 子句来定义默认值! - David W.
@DavidW。没错,这被称为三元运算符(也可以参见PEP 308),我不知道有哪种语言可以省略任何一个结果。即使if是False,您也必须评估左侧以确定默认值的类型。 - user3064538

17

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]

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接