为什么 Python 'for word in words:' 迭代单个字符而不是单词?

问题描述

当我在字符串 words 上运行以下代码时:

When I run the following code on a string words:

def word_feats(words):
    return dict([(word, True) for word in words])
print(word_feats("I love this sandwich."))

我得到的是字母而不是单词的输出字典理解:

I get the output dict-comprehension in letters instead of words:

{'a': True, ' ': True, 'c': True, 'e': True, 'd': True, 'I': True, 'h': True, 'l': True, 'o': True, 'n': True, 'i': True, 's': True, 't': True, 'w': True, 'v': True, '.': True}

我做错了什么?


解决方案

你需要显式拆分空格上的字符串:

You need to explicitly split the string on whitespace:

def word_feats(words):
    return dict([(word, True) for word in words.split()])

这使用 str.split() 而没有参数,在任意宽度的空白处分割(包括制表符和行分隔符).否则,字符串是单个字符的序列,直接迭代实际上只会遍历每个字符.

This uses str.split() without arguments, splitting on arbitrary-width whitespace (including tabs and line separators). A string is a sequence of individual characters otherwise, and direct iteration will indeed just loop over each character.

然而,拆分成单词必须是您需要自己执行的显式操作,因为不同的用例对如何将字符串拆分成单独的部分有不同的需求.例如,标点符号算不算?括号或引用呢,也许按这些分组的单词不应该分开?等等.

Splitting into words, however, has to be an explicit operation you need to perform yourself, because different use-cases will have different needs on how to split a string into separate parts. Does punctuation count, for example? What about parenthesis or quoting, should words grouped by those not be split, perhaps? Etc.

如果您所做的只是将所有值设置为 True,那么使用 dict.fromkeys() 改为:

If all you are doing is setting all values to True, it'll be much more efficient to use dict.fromkeys() instead:

def word_feats(words):
    return dict.fromkeys(words.split(), True)

演示:

>>> def word_feats(words):
...     return dict.fromkeys(words.split(), True)
... 
>>> print(word_feats("I love this sandwich."))
{'I': True, 'this': True, 'love': True, 'sandwich.': True}

相关文章