A ordem de compreensão de lista aninhada e expressão de gerador nested em python

Sou novo no Python e confuso com um pedaço de código na documentação oficial do Python.

unique_words = set(word for line in page for word in line.split()) 

Para mim, parece equivalente a:

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

Como a linha pode ser usada no primeiro loop antes de ser definida no loop nested? No entanto, isso realmente funciona. Eu acho que isso sugere que a ordem de compreensão da lista aninhada e expressão do gerador é da esquerda para a direita, o que contradiz com o meu entendimento anterior.

Alguém pode esclarecer a ordem correta para mim?

word for line in page for word in line.split()

esta parte funciona assim:

 for line in page: for word in line.split(): print word 

() isso faz com que “function geradora, portanto, todo o trabalho de declaração mentir isso: –

 def solve(): for line in page: for word in line.split(): yield word 

e set () é usado para evitar duplicidade ou repetição da mesma palavra, pois o código serve para obter ‘palavras únicas’.

Do tutorial na documentação oficial:

Uma compreensão de lista consiste em parênteses que contêm uma expressão seguida por uma cláusula for, então zero ou mais para cláusulas ou if. O resultado será uma nova lista resultante da avaliação da expressão no contexto das cláusulas for e if que a seguem. Por exemplo, este listcomp combina os elementos de duas listas, se não forem iguais:

 >>> [(x, y) para x em [1,2,3] para y em [3,1,4] se x! = y]
 [(1, 3), (1, 4), (2, 3), (2, 1), (2, 4), (3, 1), (3, 4)]

e é equivalente a:

 >>> pentes = []
 >>> para x em [1,2,3]:
 ... para y em [3,1,4]:
 ... se x! = y:
 ... combs.append ((x, y))
 ...
 >>> pentes
 [(1, 3), (1, 4), (2, 3), (2, 1), (2, 4), (3, 1), (3, 4)]

Observe como a ordem das instruções for e if é a mesma nesses dois snippets.

Veja a última frase citada acima.

Observe também que o constructo que você está descrevendo não é (oficialmente) chamado de “compreensão da lista aninhada”. Uma compreensão de lista aninhada envolve uma compreensão de lista que está dentro de outra compreensão de lista , como (novamente no tutorial):

 [[row[i] for row in matrix] for i in range(4)] 

A única coisa que você está perguntando é simplesmente uma compreensão da lista com várias cláusulas.

Você tem os loops errados. Usa isto:

 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) 

saída:

 C:\...>python test.py set(['sdaf', 'sadfa', 'sfsf', 'fsdf', 'fa', 'sdf', 'asd', 'asdf']) set(['sdaf', 'sadfa', 'sfsf', 'fsdf', 'fa', 'sdf', 'asd', 'asdf']) 

Você tem os loops nesteds misturados. O que o código faz é:

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

Além das respostas certas que enfatizavam o ponto do pedido, eu adicionaria o fato de que usamos set para deletar duplicatas da linha para criar “palavras únicas”. verifique isso e esta discussão

 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 
Intereting Posts