【问题标题】:List comprehension for string in Python, using if else conditionPython中字符串的列表理解,使用if else条件
【发布时间】:2018-04-12 00:29:44
【问题描述】:
hidden_word = ""
for c in word:
     hidden_word += c if c in guesses else'-'
return hidden_word

我正在尝试使用列表理解在一行代码中完成此操作,但在使 if-else 条件正常工作时遇到了麻烦,我认为我遗漏了一些东西。基本上如果 word = 'yes' 并且 guesses 包含 'e' 那么结果应该是 '-e-'。我能够适当地放置这封信,但如果这封信不在猜测中,我在放置“-”的逻辑上有问题。

【问题讨论】:

  • 这应该可以了,你有什么问题?
  • hidden_word = ''.join(c if c in guesses else '-' for c in word).

标签: python string list list-comprehension


【解决方案1】:

我认为您的代码很好 - 它明白了重点。为什么要使用列表推导(然后将其转换回字符串)?

hidden_word = ''.join([c if c in guesses else '-' for c in word])

真的更好吗?您可以将其更改为生成器表达式,但仍然...

hidden_word = ''.join(c if c in guesses else '-' for c in word)

编辑:使用 1000 个字符的“单词”对此进行测试:

import timeit
setup = """import random
chars = "abcdefghijklmnopqrstuvwxyz"
s = "".join(random.choice(chars) for _ in range(1000))
guesses = "agjoxwz"
"""

t1 = "hidden_word = ''.join([c if c in guesses else '-' for c in s])"
t2 = "hidden_word = ''.join(c if c in guesses else '-' for c in s)"
t3 = """hidden_word = ""
for c in s:
     hidden_word += c if c in guesses else '-'"""

结果:

In [24]: timeit.timeit(setup=setup, stmt=t1)
Out[24]: 100.88796829901968

In [25]: timeit.timeit(setup=setup, stmt=t2)
Out[25]: 147.86355467070305

In [26]: timeit.timeit(setup=setup, stmt=t3)
Out[26]: 247.9441536138757

哇哦。所以列表推导实际上必须更快(并且比生成器表达式更好)。

每个“单词”只有 50 个字母,差异不那么明显,但列表理解仍然胜出:

In [28]: timeit.timeit(setup=setup, stmt=t1)
Out[28]: 5.416419290962722

In [29]: timeit.timeit(setup=setup, stmt=t2)
Out[29]: 7.828715333297168

In [30]: timeit.timeit(setup=setup, stmt=t3)
Out[30]: 7.984714775332918

【讨论】:

  • 在这样的循环中使用+/+=进行字符串连接,如果字符串很长,效率可能会很低。这是在序列中更喜欢''join() 的原因之一。也许字符串很短并且性能不是问题,在这种情况下,更具可读性的解决方案会更好。
  • @mhawke:我似乎记得字符串“添加”在最近的 Python 版本中变得更加高效,而 ''.join() 的速度优势已经消失。但我需要对此进行测试。
  • @mhawke:我错了。在长字符串上添加实际上要糟糕得多。谢谢!
猜你喜欢
  • 2020-08-27
  • 2020-01-07
  • 1970-01-01
  • 2023-03-14
  • 2023-03-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-20
相关资源
最近更新 更多