有人可以帮助我了解使用'dw'[w.isalpha()]时发生了什么吗?

时间:2018-09-02 20:38:21

标签: python string python-3.x isalpha

部分代码来自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']

预先感谢您可能提供的帮助或理解。

0 个答案:

没有答案