2012-04-20 56 views
0

我有一個關於在Python列表連接的問題,我有這樣的一段代碼:Python的 - 連接列表

def lista(): 
    word = sys.argv[1] 
    l = [] 
    m = [] 
    for file_name in sys.argv[2:]: 
     with open(file_name, "r") as f: 
      for line in f: 
       l + [len(re.findall(word, line))] #doesn't work 
       m.append(len(re.findall(word, line))) #works 
    print l 
    print m 
    return l 

當我運行這個功能,我總是空的列表L,但也有元素男,爲什麼l + [elem] doesen't不爲我工作?

+0

註釋:L是一個糟糕的變量名:http://www.python.org/dev/peps/pep-0008/ – jamylak 2012-07-13 09:14:30

回答

4

您從不爲l分配新值。你應該使用分配。 嘗試調用l = l + [len(re.findall(word,line))]

編輯:另一種選擇是使用+ =算子的:l+=[len(re.findall(word,line))]

3

因爲l+[len(re.findall(word,line))]是剛加入這兩個名單,但丟掉的結果。你可能想

l+=[len(re.findall(word,line))] 

一般性意見:

  • 你的變量名,不按PEP-8
  • 追加列表是昂貴的,一般不Python的。您可以爲此使用發電機。
  • 您應該在文件中使用with語句,以確保即使發生異常也會關閉它。

這裏是程序與建議的編輯。

def lista(): 
    word=sys.argv[1] 
    def search(): 
     for file_name in sys.argv[2:]: 
      with open(file_name,"r") as fin: 
       for line in fin: 
        yield len(re.findall(word,line)) 
    return [l for l in search()] 
+0

感謝編輯。 – Andna 2012-04-20 09:45:49

1
l = l+[len(re.findall(word,line))] #works 
2

在這裏,你只想用l.append() - 你在做什麼有同樣的效果,但它的可讀性和更慢。

python -m timeit -s "l=[]" "for i in range(1000):" " l.append(i)" 
10000 loops, best of 3: 106 usec per loop 

python -m timeit -s "l=[]" "for i in range(1000):" " l += [i]" 
10000 loops, best of 3: 124 usec per loop