2012-04-20 10 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を得るが、Mの要素がありますなぜl + [elem]は私のために働かないのですか?

+0

注:http://www.python.org/dev/peps/pep-0008/編集用 – jamylak

答えて

4

あなたは決して新しい値をlに割り当てません。あなたは割り当てを使うべきです。 l = l + [len(re.findall(word,line))]

EDITを呼び出してみてください。l+=[len(re.findall(word,line))]

3

l+[len(re.findall(word,line))]のでちょうど2つのリストを追加することが、結果を捨てている:別のオプションは、+ = opertorを使用することです。

  • あなたの変数名のリストを追加はすることはコストがかかり、一般的に神託ではありませんPEP-8
  • によるとされていません:あなたはおそらく

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

    一般的な観察がしたいですこの目的でジェネレータを使用することができます。

  • ファイルでwithステートメントを使用して、例外が発生しても閉じられることを確認する必要があります。

ここには推奨される編集内容のプログラムがあります。あなただけl.append()を使用したい

ここ
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

ありがとう:lは悪い変数名です。 – Andna

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

- それは読みにくくしても遅いのです除き、あなたがやっていることは、同じ効果があります。

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 
関連する問題