复杂的Python列表理解

时间:2014-08-11 08:44:51

标签: python python-2.7 list-comprehension

有人可以解释列表理解究竟是如何在这里工作的吗?

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()的确切程度如何?

2 个答案:

答案 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)