部分代码来自CheckIO对此problem的解决方案。我从未见过这样的事情,我也不知道它是如何工作的。有人会乐于提供一个解释,或者可能将我引向某些资源的方向,这些资源可能会让我了解这里发生的事情。
问题如下:给您一个字符串,单词和数字之间用空格(一个空格)分隔。单词仅包含字母。您应该检查字符串是否连续包含三个单词。例如,字符串“开始5一二三7结束”连续包含三个单词。
我想了解的解决方案是:
def three_words(words: str) -> bool:
return 'www' in ''.join('dw'[w.isalpha()] for w in words.split())
尤其是'dw'[w.isalpha()]
。当w.isalpha()
的值为True时,返回“ w”,为False时,返回d。没有任何明显的运算符,很难理解为什么会发生这种情况。
我试图分解代码以更清楚地了解发生了什么:
def three_words(words: str) -> bool:
words_or_digits = []
for w in words.split():
print('dw'[w.isalpha()])
words_or_digits += 'dw'[w.isalpha()]
print(words_or_digits)
return 'www' in ''.join(words_or_digits)
这种说法证实了我的怀疑,但目前尚不清楚为什么能奏效。我也尝试使用dis
进行调查,但是我不确定我是否能理解两者的输出。这是在以下位置添加dis
时得到的输出:
from dis import dis
def three_words(words: str) -> bool:
words_or_digits = []
for w in words.split():
print('dw'[w.isalpha()])
dis('dw'[w.isalpha()])
words_or_digits += 'dw'[w.isalpha()]
print(words_or_digits)
return 'www' in ''.join(words_or_digits)
three_words("He is 123 man")
w
1 0 LOAD_NAME 0 (w)
2 RETURN_VALUE
w
1 0 LOAD_NAME 0 (w)
2 RETURN_VALUE
d
1 0 LOAD_NAME 0 (d)
2 RETURN_VALUE
w
1 0 LOAD_NAME 0 (w)
2 RETURN_VALUE
['w', 'w', 'd', 'w']
预先感谢您可能提供的帮助或理解。