我是Python的新手,并且对Python官方文档中的一段代码感到困惑。
unique_words = set(word for line in page for word in line.split())
对我来说,它看起来相当于:
unique_words=set()
for word in line.split():
for line in page:
unique_words.add(word)
如何在嵌套循环中定义之前在第一个循环中使用该行?但是,它确实有效。我认为这表明嵌套列表理解和生成器表达的顺序是从左到右,这与我之前的理解相矛盾。
有人可以为我澄清正确的订单吗?
答案 0 :(得分:4)
word for line in page for word in line.split()
这部分的工作原理如下: -
for line in page:
for word in line.split():
print word
()
这使它成为“生成器函数”
因此,整体声明的工作在于: -
def solve():
for line in page:
for word in line.split():
yield word
和set()用于避免重复或重复相同的单词,因为代码意味着获得“独特的单词”。
答案 1 :(得分:1)
来自官方文档中的tutorial:
列表推导由括号组成,括号中包含一个表达式,后跟一个for子句,然后是零个或多个for或if子句。结果将是一个新列表,该列表是通过在其后面的for和if子句的上下文中计算表达式得到的。例如,如果列表不相等,则此listcomp将两个列表的元素组合在一起:>>> [(x, y) for x in [1,2,3] for y in [3,1,4] if x != y] [(1, 3), (1, 4), (2, 3), (2, 1), (2, 4), (3, 1), (3, 4)]它相当于:>>> combs = [] >>> for x in [1,2,3]: ... for y in [3,1,4]: ... if x != y: ... combs.append((x, y)) ... >>> combs [(1, 3), (1, 4), (2, 3), (2, 1), (2, 4), (3, 1), (3, 4)]请注意这两个片段中for和if语句的顺序是如何相同的。
参见上面引用的最后一句话。
另请注意,您正在描述的构造不(正式)称为嵌套列表理解"。嵌套列表理解需要列表理解,这是在另一个列表理解中,例如(再次来自教程):
[[row[i] for row in matrix] for i in range(4)]
您提出的问题仅仅是包含多个for
子句的列表理解。
答案 2 :(得分:0)
你的循环错了。使用此:
unique_words = set(word for line in page for word in line.split())
print unique_words
l = []
for line in page:
for word in line.split():
l.append(word)
print set(l)
输出:
C:\...>python test.py
set(['sdaf', 'sadfa', 'sfsf', 'fsdf', 'fa', 'sdf', 'asd', 'asdf'])
set(['sdaf', 'sadfa', 'sfsf', 'fsdf', 'fa', 'sdf', 'asd', 'asdf'])
答案 3 :(得分:0)
您将嵌套循环混合在一起。代码的作用是:
unique_words={}
for line in page:
for word in line.split():
unique_words.add(word)
答案 4 :(得分:-1)