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