web-dev-qa-db-ja.com

値でリスト要素を削除する簡単な方法はありますか?

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

しかし、これを行うためのより簡単な方法はありませんか?

827
zjm1126

リスト内で最初に出現した要素を削除するには、単にlist.removeを使用します。

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

それはあなたの要素のすべての出現を削除しないことに注意してください。それにはリスト内包表記を使用してください。

>>> a = [10, 20, 30, 40, 20, 30, 40, 20, 70, 20]
>>> a = [x for x in a if x != 20]
>>> print a
[10, 30, 40, 30, 40, 70]
1326
Johannes Charra

できないことをするように指示した場合、通常PythonはExceptionをスローします。

if c in a:
    a.remove(c)

または

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

例外が期待して適切に処理している限り、例外は必ずしも悪いことではありません。

159
Dave Webb

できるよ

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

しかし上記のリストで2回6回検索する必要があるので、exceptを試してみましょう

try:
    a.remove(6)
except:
    pass
73
YOU

検討してください:

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

すべての出現を取り出すには、pythonのフィルタ関数を使用できます。

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

したがって、それはa!= 2のすべての要素を保持します。

ただ一つのアイテムを取り出すには 

a.remove(2)
49
mathwizurd

インプレースで行う方法は次のとおりです(リストの理解なし)。

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

どの値を削除するべきか知っていれば、これは簡単な方法です(とにかく私が考えることができるのと同じくらい簡単):

a = [0, 1, 1, 0, 1, 2, 1, 3, 1, 4]
while a.count(1) > 0:
    a.remove(1)

[0, 0, 2, 3, 4]が手に入ります

11
gil

もう1つの可能性は、セットがアプリケーションで適用可能な場合、リストの代わりにセットを使用することです。

あなたのデータが順序付けられていない、そして重複がない場合はIE

my_set=set([3,4,2])
my_set.discard(1)

エラーフリーです。

多くの場合、リストは実際には順序付けされていない項目の単なる便利なコンテナです。リストから要素のすべての出現を削除する方法を尋ねる質問があります。あなたが最初の場所で複製をしたくないならば、もう一度、セットは便利です。

my_set.add(3)

my_setを上から変更しません。

11
GreenAsJade

他の多数の回答で述べられているように、list.remove()は機能しますが、項目がリストになければValueErrorを投げます。 Python 3.4以降では、 抑制コンテキストマネージャ を使用して、これを処理するための興味深いアプローチがあります。

from contextlib import suppress
with suppress(ValueError):
    a.remove('b')
9
Felk

この例は速く、リストから値のすべてのインスタンスを削除します。

a = [1,2,3,1,2,3,4]
while True:
    try:
        a.remove(3)
    except:
        break
print a
>>> [1, 2, 1, 2, 4]
7
Chase Adams

リスト内の値を見つけて、そのインデックスを削除する(存在する場合)のは、単にリストのremoveメソッドを使用することでより簡単です。

>>> a = [1, 2, 3, 4]
>>> try:
...   a.remove(6)
... except ValueError:
...   pass
... 
>>> print a
[1, 2, 3, 4]
>>> try:
...   a.remove(3)
... except ValueError:
...   pass
... 
>>> print a
[1, 2, 4]

これを頻繁にするのであれば、それを関数にまとめることができます。

def remove_if_exists(L, value):
  try:
    L.remove(value)
  except ValueError:
    pass
7
Roger Pate

一行で:

a.remove('b') if 'b' in a else None

時々それは便利です

6
Andrey Suglobov

あなたの要素が異なっていれば、それから簡単なセットの違いは大丈夫です。

c = [1,2,3,4,'x',8,6,7,'x',9,'x']
z = list(set(c) - set(['x']))
print z
[1, 2, 3, 4, 6, 7, 8, 9]
6
Pagol

.popを使うこともできます。

>>> lst = [23,34,54,45]
>>> remove_element = 23
>>> if remove_element in lst:
...     lst.pop(lst.index(remove_element))
... 
23
>>> lst
[34, 54, 45]
>>> 
3
SuperNova

たとえば、xから1をすべて削除したいとします。これは私がそれに取り組む方法です:

x = [1, 2, 3, 1, 2, 3]

今、これは私の方法の実用的な使い方です:

def Function(List, Unwanted):
    [List.remove(Unwanted) for Item in range(List.count(Unwanted))]
    return List
x = Function(x, 1)
print(x)

そしてこれが私の方法です。

[x.remove(1) for Item in range(x.count(1))]
print(x)

どちらも出力としてこれを生成します。

[2, 3, 2, 3, 2, 3]

お役に立てれば。 PSさん、これはバージョン3.6.2で書かれていたので、古いバージョン用に調整する必要があるかもしれません。

2
Krohnus Melavea

Forループと条件付き

def cleaner(seq, value):    
    temp = []                      
    for number in seq:
        if number != value:
            temp.append(number)
    return temp

そして、全部ではなく一部を削除したい場合

def cleaner(seq, value, occ):
    temp = []
    for number in seq:
        if number == value and occ:
            occ -= 1
            continue
        else:
            temp.append(number)
    return temp
2
user7970984
 list1=[1,2,3,3,4,5,6,1,3,4,5]
 n=int(input('enter  number'))
 while n in list1:
    list1.remove(n)
 print(list1)
2
Ravikiran D

削除したい要素以外のものすべてにインデックスを付けてリストを上書きします。

>>> s = [5,4,3,2,1]
>>> s[0:2] + s[3:]
[5, 4, 2, 1]
2
kilojoules

たぶんあなたの解決策はintとうまくいくが、それは辞書と一緒に私のために働かない。

一方で、remove()は私にとってはうまくいきませんでした。しかし多分それは基本的なタイプで動作します。以下のコードはオブジェクトリストから項目を削除する方法でもあると思います。

一方、 'del'も正しく機能していません。私の場合は、python 3.6を使用します。 'for'コマンドで 'for' bucleのリストから要素を削除しようとすると、pythonがプロセス内のインデックスを変更し、bucleが途中で停止します。 reverse の順序で要素ごとに削除した場合にのみ機能します。このようにして、処理中に保留中の要素の配列インデックスを変更しないでください。

それから、イムは使用しました:

c = len(list)-1
for element in (reversed(list)):
    if condition(element):
        del list[c]
    c -= 1
print(list)

'list'は[{'key1':value1 '}、{' key2 ':value2}、{' key3 ':value3}、...]のようになります。

また、enumerateを使ってもっとPythonicをすることができます。

for i, element in enumerate(reversed(list)):
    if condition(element):
        del list[(i+1)*-1]
print(list)
1
David Martínez
arr = [1, 1, 3, 4, 5, 2, 4, 3]

# to remove first occurence of that element, suppose 3 in this example
arr.remove(3)

# to remove all occurences of that element, again suppose 3
# use something called list comprehension
new_arr = [element for element in arr if element!=3]

# if you want to delete a position use "pop" function, suppose 
# position 4 
# the pop function also returns a value
removed_element = arr.pop(4)

# u can also use "del" to delete a position
del arr[4]
0

構文:lst.remove(x)

例えば:

lst = ['one', 'two', 'three', 'four', 'two']

lst.remove('two') #it will remove first occurence of 'two' in a given list
del lst[2] #delete item by index value

print(lst)
0
Ganesh Kharad

これは、配列"-v"からsys.argvのすべてのインスタンスを削除し、インスタンスが見つからない場合は文句を言いません。

while "-v" in sys.argv:
    sys.argv.remove('-v')

実際のコードはspeechToText.pyというファイルにあります。

$ python speechToText.py -v
['speechToText.py']

$ python speechToText.py -x
['speechToText.py', '-x']

$ python speechToText.py -v -v
['speechToText.py']

$ python speechToText.py -v -v -x
['speechToText.py', '-x']
0
Mike Slinn