有人可以解释列表理解究竟是如何在这里工作的吗?
page = 'one two one three\n' * 10
unique_words = list(word for line in page for word in line.split())
print unique_words
输出
['o', 'n', 'e', 't', 'w', 'o', 'o', 'n', 'e', 't', 'h', 'r', 'e', 'e', 'o', 'n', 'e', 't', 'w', 'o', 'o', 'n', 'e', 't', 'h', 'r', 'e', 'e', 'o', 'n', 'e', 't', 'w', 'o', 'o', 'n', 'e', 't', 'h', 'r', 'e', 'e']
我对变量的声明位置和使用位置感到困惑? 例如最初我们只知道页面为字符串,
line in page
- >应该返回字符串中的每个字符。
word in line.split()
- >正在删除'\ n'和空格并返回每个字符
因此输出。但我仍然不明白编写它的方式,以便编译器理解我想要的东西。
问题:编译器一步一步地处理word for line in page for word in line.split()
的确切程度如何?
答案 0 :(得分:4)
你需要看到双for
个循环从左到右嵌套:
for line in page:
for word in line.split():
word
你有一个长字符串,所以for line in page
遍历每个个别字符; line
一次只有一个字符。拆分该字符会为您提供仅包含该字符的列表,除非该字符是空格(空格,换行符,制表符等):
>>> page = 'one two one three\n' * 10
>>> list(page)
['o', 'n', 'e', ' ', 't', 'w', 'o', ' ', 'o', 'n', 'e', ' ', 't', 'h', 'r', 'e', 'e', '\n', 'o', 'n', 'e', ' ', 't', 'w', 'o', ' ', 'o', 'n', 'e', ' ', 't', 'h', 'r', 'e', 'e', '\n', 'o', 'n', 'e', ' ', 't', 'w', 'o', ' ', 'o', 'n', 'e', ' ', 't', 'h', 'r', 'e', 'e', '\n', 'o', 'n', 'e', ' ', 't', 'w', 'o', ' ', 'o', 'n', 'e', ' ', 't', 'h', 'r', 'e', 'e', '\n', 'o', 'n', 'e', ' ', 't', 'w', 'o', ' ', 'o', 'n', 'e', ' ', 't', 'h', 'r', 'e', 'e', '\n', 'o', 'n', 'e', ' ', 't', 'w', 'o', ' ', 'o', 'n', 'e', ' ', 't', 'h', 'r', 'e', 'e', '\n', 'o', 'n', 'e', ' ', 't', 'w', 'o', ' ', 'o', 'n', 'e', ' ', 't', 'h', 'r', 'e', 'e', '\n', 'o', 'n', 'e', ' ', 't', 'w', 'o', ' ', 'o', 'n', 'e', ' ', 't', 'h', 'r', 'e', 'e', '\n', 'o', 'n', 'e', ' ', 't', 'w', 'o', ' ', 'o', 'n', 'e', ' ', 't', 'h', 'r', 'e', 'e', '\n', 'o', 'n', 'e', ' ', 't', 'w', 'o', ' ', 'o', 'n', 'e', ' ', 't', 'h', 'r', 'e', 'e', '\n']
>>> page[0].split()
['o']
>>> page[3].split()
[]
所以最终结果是一个包含单个字符的列表。
请注意,从技术上讲,您有生成器表达式提供list()
电话;然而,输出与列表理解相同。如果您将list(...)
替换为[...]
,则会获得列表理解。
如果您想要唯一字词,请使用set()
代替简单的str.split()
来电,无需循环播放:
unique_words = set(page.split())
str.split()
已经将您的句子拆分为所有空白上的文字,包括换行符; set()
删除所有重复项:
>>> set(page.split())
{'two', 'one', 'three'}
答案 1 :(得分:2)
你从左到右阅读:
[word for line in page for word in line.split()]
与:
相同mylist=[]
for line in page:
for word in line.split():
mylist.append(word)