Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/344.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
python中嵌套列表理解和嵌套生成器表达式的顺序_Python_Generator_List Comprehension - Fatal编程技术网

python中嵌套列表理解和嵌套生成器表达式的顺序

python中嵌套列表理解和嵌套生成器表达式的顺序,python,generator,list-comprehension,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) >>> combs = [] >>> for x in [1,2,3]:

我是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)
>>> 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)] 在嵌套循环中定义行之前,如何在第一个循环中使用行?然而,它实际上是有效的。我认为这表明嵌套列表理解和生成器表达式的顺序是从左到右,这与我以前的理解相矛盾


谁能帮我澄清一下正确的顺序吗?

你把循环搞错了。使用以下命令:

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'])

word-for-line-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()用于避免重复或重复相同的单词,因为代码旨在获得“唯一的单词”。

嵌套循环混合在一起。代码的作用是:

unique_words={}
for line in page:
    for word in line.split():
        unique_words.add(word)

除了强调顺序问题的正确答案之外,我还要补充一个事实,即我们使用set来删除行中的重复项,以生成“唯一的单词”。检查和螺纹

从官方文件中的:

列表理解由括号组成,括号中包含表达式,后跟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)]
你要问的只是一个包含多个
for
子句的列表理解。

你的循环倒过来了。页面中行的
部分应该是外部循环。如果您认为嵌套循环是等效的,则需要解释外部循环中
行的定义位置。嵌套生成器表达式中的顺序与任何嵌套循环中的顺序相同。相关:他是对的!我应该是一个集合,而不是一个列表。这是一种删除重复值的方法。请解释下一票,这样我可以增强我的回答伟大的答案;我想补充一个事实,即一个集合用于删除重复项
(逐行逐页,逐行逐字.split())
注意,第一个示例并没有回答这个问题:
x
y
是独立的,可以交换,而OP的示例中不是这样。@EricDuminil-它确实回答了这个问题。OP想知道在理解中解析
子句的多个
的正确顺序。实际上,OP已经从观察行为推断出正确的顺序,但需要确认。有什么比官方文件更好的确认?
x
y
是否独立无关。相关部分将理解展开为其等效的嵌套循环形式,顺便说一句,这正是被接受和投票最高的答案所做的(除了该答案没有引用任何引用来证明其合理性)。我仍然认为这是一个糟糕的示例选择(在文档中,不是您的答案)因为可以交换
x
y
。它并没有真正涵盖OP的情况,单词在行,行在页。@EricDuminil-我理解你的意思,但重点是它确实涵盖OP的情况,因为重要的是循环的顺序。请注意,虽然
x
y
是独立的,但它们并不相等。所以如果你交换它们,你会得到不同的结果。你似乎在说,在OP的例子中,顺序错误会破坏程序。当然可以,但在教程示例中,如果它恰好位于一个无法处理最左边元素为
4
的元组的程序中,那么它也会出错。如果您理解了教程示例,您就理解了如何解析OP的代码段。
{}
不会创建空集。 >>> 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)]
[[row[i] for row in matrix] for i in range(4)]