4.2 对每个元素进行操作

3节中,我们看到计数词汇以外的其他项目的一些例子。让我们仔细看看我们所使用的符号:

  1. >>> [len(w) for w in text1]
  2. [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, ...]
  3. >>> [w.upper() for w in text1]
  4. ['[', 'MOBY', 'DICK', 'BY', 'HERMAN', 'MELVILLE', '1851', ']', 'ETYMOLOGY', '.', ...]
  5. >>>

这些表达式形式为[f(w) for ...][w.f() for ...],其中f 是一个函数,用来计算词长,或把字母转换为大写。现阶段你还不需要理解两种表示方法:f(w)w.f()。而只需学习对列表上的所有元素执行相同的操作的这种 Python 习惯用法。在前面的例子中,遍历text1中的每一个词,一个接一个的赋值给变量w 并在变量上执行指定的操作。

注意

上面描述的表示法被称为“列表推导”。这是我们的第一个 Python 习惯用法的例子,一中固定的表示法,我们习惯使用的方法,省去了每次分析的烦恼。掌握这些习惯用法是成为一流 Python 程序员的一个重要组成部分。

让我们回到计数词汇的问题,这里使用相同的习惯用法:

  1. >>> len(text1)
  2. 260819
  3. >>> len(set(text1))
  4. 19317
  5. >>> len(set(word.lower() for word in text1))
  6. 17231
  7. >>>

由于我们不重复计算像 This 和 this 这样仅仅大小写不同的词,就已经从词汇表计数中抹去了 2,000 个!还可以更进一步,通过过滤掉所有非字母元素,从词汇表中消除数字和标点符号:

  1. >>> len(set(word.lower() for word in text1 if word.isalpha()))
  2. 16948
  3. >>>

这个例子稍微有些复杂:将所有纯字母组成的词小写。也许只计数小写的词会更简单一些,但这却是一个错误的答案(为什么?)。

如果你对列表推导不那么充满信心,请不要担心,因为在下面的章节中你会看到更多的例子及解释。