2016-09-30 28 views
1

代碼的目的是收集詞表的所有字符,我做了以下內容:這個列表理解爲什麼不工作?

wordlist = ['cat','dog','rabbit'] 
[c for c in word for word in wordlist] 

輸出是奇怪:

['r', 
'r', 
'r', 
'a', 
'a', 
'a', 
'b', 
'b', 
'b', 
'b', 
'b', 
'b', 
'i', 
'i', 
'i', 
't', 
't', 
't'] 

我知道我可以用做:

[ch for ch in "".join(wordlist)] 

[word[i] for word in wordlist for i in range(len(word))] 

然而,我的第一個建議似乎也是對的,誰能告訴我爲什麼第一個不起作用?

+3

你需要''[c爲單詞中的單詞列表中的單詞]'。它與循環的形成順序以及它們是否嵌套有關。 –

+0

[c爲單詞中的單詞列表] – MMF

+1

我發現這更易讀:'list(「」。join(wordlist))' –

回答

2

你在錯誤的順序for聲明:

[c for c in word for word in wordlist] 

應該

[c for word in wordlist for c in word] 

記得在列表理解的for語句的順序的方法是如何想像你會把它寫成一個循環。順序遵循縮進:

result = [] 
for word in wordlist: 
    for c in word: 
     result.append(c) 
3

的問題是與才能在修真for報表,他們必須被交換:

In [10]: [c for word in wordlist for c in word] 
Out[10]: ['c', 'a', 't', 'd', 'o', 'g', 'r', 'a', 'b', 'b', 'i', 't'] 

注意的原因,爲你工作,並沒有失敗,「word未定義」的錯誤,是你有word變量定義爲rabbit在範圍內:

In [3]: [c for c in word for word in wordlist] 
--------------------------------------------------------------------------- 
NameError         Traceback (most recent call last) 
<ipython-input-7-decfecd23a92> in <module>() 
----> 1 [c for c in word for word in wordlist] 

NameError: name 'word' is not defined 
In [4]: word = 'rabbit' 

In [5]: [c for c in word for word in wordlist] 
Out[5]: 
['r', 
'r', 
'r', 
'a', 
'a', 
'a', 
'b', 
'b', 
'b', 
'b', 
'b', 
'b', 
'i', 
'i', 
'i', 
't', 
't', 
't'] 
+0

但爲什麼輸出看起來像這樣? – fizis

+0

我知道,第一個w是一個已定義的gloabal變量,而第二個循環中的w是局部變量。 – fizis