2011-04-11 7 views
0

これは私のコードです:Pythonリストから何らかの値が出現するたびに削除されますか?

a = [1,2,3,43,43,43] 

count = a.count(43) 
if count > 0: 
    for i in range(count): 
     a.remove(43) 

print a 

は、これを達成するための簡単な方法はありますか?

+1

これも素晴らしいアルゴリズムではありません。あなたが 'a.remove(43)'を実行するたびに、Pythonはリストの最初から再び開始するので、あなたは値[1,2,3]を繰り返しテストしています。ビッグO表記では、これはO(n^2)です。 O(n) –

答えて

8

a = [x for x in a if x != 43] 
3

itertoolsをお試しください:

>>> import itertools 
>>> a = [1, 2, 3, 43, 43, 45] 
>>> iter = itertools.ifilter(lambda x: x != 43, a) 
>>> list(iter) 
[1, 2, 3] 
+0

一般的に、リスト内包表記とジェネレータ式が優れています。 – minhee

+0

はい、私は同意します: –

+3

'itertools'は、標準的なジェネレータツール上に構築された素敵なツールです。これは非常に便利ですが、私が思うこの特定の問題のために少し余裕があります。 –

1

を試してみて、あなただけのリストa内のすべての43Sを削除したいですか?場所にオリジナルのものを修正する新しいリストを作成し、しません(削除、しかし、1つは、非線形実行時間を持って使用して1を除く)

a = [x for x in a if x != 43] 
+1

少しのタイプミスがありますか?それは '[x in a x ...ではなく、' [x for a....'ではないでしょうか? –

+0

はい、そうです。私は編集しました。 – minhee

3

注上記のすべてのソリューションという。これはあなたのケースでは問題になるかもしれません。元のリストを変更する場合は、次のようなスライスの割り当てを使用する必要があります。

a[:] = [value for value in a if value != 43] 
+0

ここでスライスの割り当てが必要なのはなぜですか? –

+2

私はコードの上のコメントで言うように、これは元のリストを変更したい場合です。これは、関数の引数としてリストが渡され、関数が呼び出し側が見たリストを変更するという副作用があると考えている場合には重要です。 –

+1

+1ああ、良い例! –

関連する問題