如果变量为真,则在字符串前面添加字符串的最有效/pythonic方法



我在几个地方有类似于以下内容的代码:

if myvar:
    thestr = "Extra text"
else:
    thestr = "text"

我考虑过通过将其更改为以下内容来缩短代码:

thestr = "%stext" % "Extra " if myvar else ""

由于无论哪种方式都在执行 if/else,我怀疑第二种方法速度较慢,因为它还必须执行字符串连接。但是,代码更短,这很好。对"文本"的更改只需要更改一次。

最好的方法是什么?任何其他推荐的方法也可以。

这里没有看到太多明显的速度差异(按所用时间的升序排序):

 In [89]: %timeit "%stext" % "Extra " if np.random.randint(-5,5)>0  else ""
1000000 loops, best of 3: 738 ns per loop
In [91]: paste
def test():
        myvar = np.random.randint(-5, 5)
        if myvar > 0:
            thestr = "Extra text"
        else:
            thestr = "text"
%timeit test()
## -- End pasted text --
1000000 loops, best of 3: 853 ns per loop

In [90]: %timeit "%stext" % ("Extra " if np.random.randint(-5,5)>0 else "")
1000000 loops, best of 3: 871 ns per loop

使用三元在代码中是最短的。而且串联速度很快,所以这不是问题。可读性和错误,你确实犯了一个错误。

您需要更明确地说明 if 大小写是什么。在您的示例中,False 布尔值将给出 " 而不是文本。您要执行此操作:

thestr = "%stext" % ("Extra " if myvar else "")

这样,您就会告诉"%stext"使用括号中包含的三元表达式格式化自身。

在我认为这种情况中,考虑到可能读错和微小错误,三元似乎不太可能值得。您可以轻松添加几行,而不会占用一堆代码。

发现它们更好的用途是在制作字典时,我可能需要一些参数来基于条件,如果我可以一次性声明它们而不是在制作字典后有一系列 if 块,那就更容易了。

food = { 
         "peanuts":   "delicious",
         "chocolate": "tasty",
         "banana":    "tasty" if peeled else "eugh",
         "apple":     "ok",
         "python":    "ew" if snake else "???",
       }

我认为多行上的if/else是我通常如何编码它。但我高度重视清晰度/显而易见性,这是最清晰/最明显的解决方案,imo。此外,这些天我通常只使用 + 运算符进行字符串连接,并且更喜欢它而不是您的 printf 样式%替换。因此,我会这样做:

if myvar:
    theStr = 'Extra ' + 'text'
else:
    theStr = 'text'

或类似。如果你愿意,你可以很容易地摆脱else条件:

theStr = 'text'
if myvar:
    theStr = 'Extra ' + theStr

这在很大程度上是一个基于意见的问题,但如果myvar是布尔值,则会出现另一种选择

text = ["text","Extra text"]
thestr = text[myvar]

这避免了"如果...否则",但有些混淆。

如果myvar不是布尔值,你可以用

text = ["text","Extra text"]
thestr = text[bool(myvar)]

或者,正如马克所说

text = ["text","Extra text"][bool(myvar)]

否则,第一种方法具有清晰的价值

最新更新