4.2 对每个元素进行操作
在3节中,我们看到计数词汇以外的其他项目的一些例子。让我们仔细看看我们所使用的符号:
>>> [len(w) for w in text1]
[1, 4, 4, 2, 6, 8, 4, 1, 9, 1, 1, 8, 2, 1, 4, 11, 5, 2, 1, 7, 6, 1, 3, 4, 5, 2, ...]
>>> [w.upper() for w in text1]
['[', 'MOBY', 'DICK', 'BY', 'HERMAN', 'MELVILLE', '1851', ']', 'ETYMOLOGY', '.', ...]
>>>
这些表达式形式为[f(w) for ...]
或[w.f() for ...]
,其中f
是一个函数,用来计算词长,或把字母转换为大写。现阶段你还不需要理解两种表示方法:f(w)
和w.f()
。而只需学习对列表上的所有元素执行相同的操作的这种 Python 习惯用法。在前面的例子中,遍历text1
中的每一个词,一个接一个的赋值给变量w
并在变量上执行指定的操作。
注意
上面描述的表示法被称为“列表推导”。这是我们的第一个 Python 习惯用法的例子,一中固定的表示法,我们习惯使用的方法,省去了每次分析的烦恼。掌握这些习惯用法是成为一流 Python 程序员的一个重要组成部分。
让我们回到计数词汇的问题,这里使用相同的习惯用法:
>>> len(text1)
260819
>>> len(set(text1))
19317
>>> len(set(word.lower() for word in text1))
17231
>>>
由于我们不重复计算像 This 和 this 这样仅仅大小写不同的词,就已经从词汇表计数中抹去了 2,000 个!还可以更进一步,通过过滤掉所有非字母元素,从词汇表中消除数字和标点符号:
>>> len(set(word.lower() for word in text1 if word.isalpha()))
16948
>>>
这个例子稍微有些复杂:将所有纯字母组成的词小写。也许只计数小写的词会更简单一些,但这却是一个错误的答案(为什么?)。
如果你对列表推导不那么充满信心,请不要担心,因为在下面的章节中你会看到更多的例子及解释。