2014-11-05 107 views
3

我是Python新手,並且被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) 

怎樣才能線在第一循環它在嵌套循環定義之前使用?但是,它確實有效。我認爲它表明了嵌套列表理解和生成器表達的順序是從左到右,這與我以前的理解相矛盾。

任何人都可以澄清正確的順序嗎?

+1

你有循環倒退。 '頁面中的行'部分應該是外部循環。 – APerson 2014-11-05 14:15:25

+0

如果你認爲你的嵌套循環是等價的,你需要解釋在外部循環中'行'的定義。嵌套的生成器表達式中的順序與任何嵌套的循環相同。 – chepner 2014-11-05 14:21:59

+1

相關:http://stackoverflow.com/q/19484705/674039 – wim 2014-11-05 14:30:51

回答

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()用於避免重複或重複相同的單詞,因爲代碼旨在獲得'獨特的單詞'。

+0

很好的答案;我想添加一組用於刪除重複項的事實 – user3378649 2014-11-05 14:23:12

+0

謝謝!現在我得到我錯誤的地方:) – Loopz 2014-11-05 14:28:01

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

他是對的! l應該是一個集合,而不是一個列表。這是一種刪除重複值的方法。 – user3378649 2014-11-05 14:21:26

+0

請解釋downvote,所以我可以提高我的答案 – 2014-11-05 14:22:51

0

你有混合的嵌套循環。什麼代碼所做的是:

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

除此之外強調秩序的角度正確的答案,我想補充一點,我們使用設置爲刪除線重複,使「唯一字」的事實。檢查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 
1

tutorial官方文件中:

列表解析由包含後跟一個用於子句,則零個或多個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)] 
注意了,如果語句的順序是如何在這兩個片段是相同的。

查看上面引用的最後一句話。

另請注意,您正在描述的構造是而不是(正式)稱爲「嵌套列表理解」。嵌套列表理解需要一個列表理解這是中的另一個列表理解,例如(再次從教程):

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

你問的事情是一個簡單的列表理解與多個for條款。

+0

請注意,第一個例子並沒有回答這個問題:'''''''''''和'y'是獨立的,可以交換,這在OP的例子中並不是這樣。 – 2017-03-04 22:35:03

+1

@EricDuminil - 它確實回答了這個問題。 OP想知道在理解中解析多個'for'從句的正確順序。實際上,OP已經從觀察行爲推斷出正確的順序,但是想要確認。比官方文件有更好的確認嗎? 「x」和「y」是否獨立無關。相關部分是將理解展開爲其等價的嵌套循環形式,這正好是被接受的並且得票最多的答案所做的(除非答案沒有引用任何參考來證明它的正確性)。 – 2017-03-06 15:15:11

+0

我仍然認爲這是一個不好的選擇(在文檔中,而不是你的答案),因爲'x'和'y'可以交換。它並沒有真正涵蓋OP的情況,即單詞在行中,行在頁面中。 – 2017-03-06 15:18:16