嵌套列表推导和嵌套生成器表达式在python中的顺序

时间:2014-11-05 14:13:58

标签: python generator list-comprehension

我是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)

如何在嵌套循环中定义之前在第一个循环中使用该行?但是,它确实有效。我认为这表明嵌套列表理解和生成器表达的顺序是从左到右,这与我之前的理解相矛盾。

有人可以为我澄清正确的订单吗?

5 个答案:

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

除了强调订单点的正确答案之外,我还要补充一个事实,即我们使用set从行中删除重复项来制作"唯一的单词"。检查thisthis主题

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.add(word)
print l