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


78

我一直在使用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

Answers:


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

dict您可以根据自己喜欢的复杂性来构建format参数。


s =“至少,{pronoun}告诉了我。”。format(pronoun = [“ she”,“ he”] [gender ==“ male”])
Jung-Hyun

可以在这里挤小精灵吗?例如format(pronoun =“ he”如果性别==“ male”代词=“ she” elif性别==“ female”否则“未找到”)
HVS

当我添加时,答案仅适用于一个if else语句(“ / {tech}”。format(如果Portfolio =='onshore'则为tech ='w',如果Portfolio =='solar'则为's'),我得到无效的语法错误
mk_sch

@HVS是可能的,请参阅关于将else/if语句串起来以模拟内联的答案elif。但是您实际上不应该,应该定义一个函数。
鲍里斯(Boris)

30

在Python 3.6+上,将带格式的字符串文字(它们称为f-strings:f"{2+2}"produces "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 ''}.")
Boris

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]
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.