値を指定してリストから要素を削除する簡単な方法ってある? [Python]

このエントリーをはてなブックマークに追加

質問:

a=[1,2,3,4]
b=a.index(6)
del a[b]
print a

これは次みたいなエラーを吐く:

Traceback (most recent call last):
File "D:\zjm_code\a.py", line 6, in <module>
b=a.index(6)
ValueError: list.index(x): x not in list

だからこうしたんだけど:

a=[1,2,3,4]
try:
b=a.index(6)
del a[b]
except:
pass
print a

でも、これをするもっと簡単な方法って無い?

By zjm1126 | 質問日時: 2010年5月8日 7:48

—–

回答1:

リスト内の最初に出てきた要素を削除するには、単に list.removeでいける:

>>> a = ['a', 'b', 'c', 'd']
>>> a.remove('b')
>>> print a
['a', 'c', 'd']

マッチする要素全部を削除しないことに注意。リストの内包表記を使う必要がある。

>>> a = [1, 2, 3, 4, 2, 3, 4, 2, 7, 2]
>>> a = [x for x in a if x != 2]
>>> print a
[1, 3, 4, 3, 4, 7]

By Johannes Charra | 回答日時: 2010年5月8日 7:56

—–

回答2:

普通Pythonは実行できない何かをするように指示すると、Exceptionを投げる。だから、下記のうちどっちかをやらないといけないよ:

if c in a:
a.remove(c)

または

try:
a.remove(c)
except ValueError:
pass

An Exception isn’t necessarily a bad thing as long as it’s one you’re expecting and handle properly.
例外は、それが君がしたいしているもので、かつ適切に処理されるなら必ずしも悪いことじゃないよ。

By Dave Webb | 回答日時: 2010年5月8日 8:02

—–

回答3:

a=[1,2,3,4]
if 6 in a:
a.remove(6)

でもこれだと、リストを6回検索する必要があるから、try-exceptだともっと早くなると思う

try:
a.remove(6)
except:
pass

By YOU | 回答日時: 2010年5月8日 7:57

—–

回答4:

こういうリストがあるとする:

a = [1,2,2,3,4,5]

マッチする全ての要素を取り出すには、pythonだとfilter関数を使用できるよ。例えばこんな感じ、

a = list(filter(lambda x: x!= 2, a))

だから、a!=2であるような要素は全てキープされる。

1つだけ取り除くような場合は

a.remove(2)

By mathwizurd | 回答日時: 2014年8月11日 19:55

—–

回答5:

新しいリストとかを使わずにインプレースでやる方法(内包表記無し):

def remove_all(seq, value):
pos = 0
for item in seq:
if item != value:
seq[pos] = item
pos += 1
del seq[pos:]

By jfs | 回答日時: 2010年5月8日 14:57

—–

Source: Is there a simple way to delete a list element by value?

共有 コメント