0

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]が機能しないのですか?

4

4 に答える 4

4

lに新しい値を割り当てることはありません。割り当てを使用する必要があります。電話してみてくださいl = l + [len(re.findall(word,line))]

編集:別のオプションは、+ =演算子を使用することです:l+=[len(re.findall(word,line))]

于 2012-04-20T09:31:35.007 に答える
3

l+[len(re.findall(word,line))]2つのリストを追加するだけで、結果を破棄するためです。あなたはおそらくしたい

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

一般的な観察:

  • 変数名がPEP-8に準拠していません
  • リストを追加するのはコストがかかり、一般的にはpythonicではありません。この目的でジェネレーターを使用できます。
  • 例外が発生した場合でも確実に閉じられるように、ファイルで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()]
于 2012-04-20T09:32:27.400 に答える
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
于 2012-04-20T09:37:35.270 に答える
1
l = l+[len(re.findall(word,line))] #works
于 2012-04-20T09:34:31.650 に答える