2014-03-04 18 views
2

這是我的第一條消息,我是學生,我開始學習python和一位非常喜歡python one-內襯.. 我已經得到了一些麻煩與Python解釋器,在這裏我的問題:Python 3.3解釋器和一行代碼問題(4行語句正常工作...)

我有一些麻煩與Python解釋器,我想一個4線轉換if/else聲明一個班輪在一個功能程序。

代碼:

# ll is a {} 

    # with one index initialized like this: 
    # {'': ['word1', 'word2', 'word3', 'word n', '...']} 
    # with a lot of word from a book 

    i, a=0, ll[''] 
    # so here a is an array like: ['word1', 'word2', 'word3', 'word n', '...'] 

    while i < len(a)-1: 
     i+=1 
     if a[i-1] not in ll: 
      ll[a[i-1]]=[a[i]] 
     else: 
      ll[a[i-1]].append(a[i]) 

這種運作良好,但如果我嘗試更換此:

if a[i-1] not in ll: 
    ll[a[i-1]]=[a[i]] 
else: 
    ll[a[i-1]].append(a[i]) 

這這一個班輪:

ll[a[i-1]] = [a[i]] if a[i-1] not in ll else ll[a[i-1]].append(a[i]) 

然後,我得到此錯誤輸出:

AttributeError: 'NoneType' object has no attribute 'append' 

(它工作在第一迭代,陣列已正確填寫,則數組突然改變爲None ...從來沒有與4行語句是一樣的看到了這一點。請幫我)

詳細說明:我在使用Python 3.3.4(從python.org安裝)的Windows上運行

當然,單線程程序應該可以正常工作,但是在我的例子中沒有太多的數據,但是在我的真實程序中,上面的錯誤...這真的很煩人!這是一個Python錯誤? (對我來說顯然是肯定的,這不是我所遇到的,即使我是一個初學者唯一的一個。)

+0

'append'就地修改列表,並將返回None。這不是一個錯誤! – jonrsharpe

+0

我知道它,但爲什麼它不能把一個現有的列表,並把一個像「應該」的字符串?這是一個錯誤.. –

+0

它應該正常工作,它在我的if/else語句中工作,正如我已經解釋過的,請閱讀我的文章 –

回答

2

else情況下,要設置

ll[a[i-1]] = ll[a[i-1]].append(a[i]) 

append將修改列表正確放置,但是return None,然後您將其分配回字典,替換列表並在下次訪問該密鑰時導致錯誤。


的最小變化是每次添加到列表:

ll[a[i-1]] = [a[i]] if a[i-1] not in ll else ll[a[i-1]] + [a[i]] 

然而,這是不是很有效,因爲它創造了一個新的列表(而不是修改舊的)每次。


一般來說,如果你面對的對的話,我會建議使用zipislice from itertools配對起來。使用collections.defaultdict作爲輸出可以節省您手動檢查已經存在的列表。

from collections import defaultdict 
from itertools import islice 

out = defaultdict(list) 
for word1, word2 in zip(words, islice(words, 1, None)): 
    out[word1].append(word2) 

這不是一條線,而是更高效。

+0

那麼,如果數組已經存在,我該如何影響一個值或追加一個新值呢? :( 謝謝 –

+0

更新了修復問題的選項 – jonrsharpe

+0

不錯的努力,非常感謝你,謝謝你的第一篇文章,我已經通過使用 ll [a [i-1]] = ll [ a [i-1]] + [a [i]] if a [i-1] in else else [a [i]] 確定它沒有效率,正如您所說的那樣,但它會爲練習做到這一點!! 再次感謝!! Regards, –