Pythonを使用して配列から特定の要素を削除する方法


138

配列から特定の要素を削除する何かを書きたいのですが。forコンテンツに一致する要素を見つけるために配列をループする必要があることはわかっています。

電子メールの配列があり、電子メール文字列に一致する要素を削除したいとします。

他の配列にも同じインデックスを使用する必要があるため、実際にはforループ構造を使用したいと思います。

ここに私が持っているコードがあります:

for index, item in emails:
    if emails[index] == 'something@something.com':
         emails.pop(index)
         otherarray.pop(index)

6
お探しlist.remove(x)ですか?
ジェイコブ

かなりではありません。forループを使用して、インデックスを再利用できるようにしたい
locoboy '19

4
繰り返しながらリストを変更しないでください。
ジェイコブ

なぜ私はこれをしてはいけないのですか?また、私にとってはうまくいきません。
locoboy '19

回答:


200

配列を反復する必要はありません。ただ:

>>> x = ['ala@ala.com', 'bala@bala.com']
>>> x
['ala@ala.com', 'bala@bala.com']
>>> x.remove('ala@ala.com')
>>> x
['bala@bala.com']

これにより、文字列に一致する最初の出現が削除されます。

編集:編集後も、繰り返し処理する必要はありません。ただやる:

index = initial_list.index(item1)
del initial_list[index]
del other_list[index]

1
上記を参照してくださいforループを使用して同じインデックスを再利用します
locoboy '19

私の答えを編集しました。まだループの必要はありません。
ボグダン

1
最初にアイテムがinitial_listに存在することをどのように確認しますか?それが存在せず、削除する必要がない場合もあります。
locoboy '19

17

filter()およびlambdaを使用すると、不要な値を削除する簡潔で簡潔な方法が提供されます。

newEmails = list(filter(lambda x : x != 'something@something.com', emails))

これは電子メールを変更しません。匿名関数がTrueを返した要素のみを含む新しいリストnewEmailsを作成します。


5

forループでインデックスが必要な場合、forループは正しくありません。

for index, item in enumerate(emails):
    # whatever (but you can't remove element while iterating)

あなたの場合、Bogdanソリューションは問題ありませんが、データ構造の選択はそれほど良くありません。同じインデックスにある他のデータに関連するデータからこれらの2つのリストを維持する必要があるのは不便です。

タプル(メール、その他のデータ)のリスト、またはメールをキーとする辞書の方が良い場合があります。


4

これを行う正しい方法はzip()、リスト内包表記/ジェネレータ式を使用することです。

filtered = (
    (email, other) 
        for email, other in zip(emails, other_list) 
            if email == 'something@something.com')

new_emails, new_other_list = zip(*filtered)

また、your'eは使用していない場合array.array()numpy.array()、その後、最も可能性の高いあなたが使用している[]list()、あなたにはない配列のリストを与えています、。同じではありません。


1
@Bogdanの回答と比較して、これがどのように「正気」であるかはわかりません。
ジョーダンラップ

配列はリストと同じではないことを指摘していただきありがとうございます。選択した回答は、2.7の配列では機能しません。
EL_DON 2017

2

この問題には、重複する一致も処理する代替ソリューションがあります。

長さが等しい2つのリストから始めます:emailsotherarray。目的は、各インデックスのために両方のリストから項目を削除することであるiところemails[i] == 'something@something.com'

これは、リスト内包表記を使用して、次のように分割することで実現できますzip

emails = ['abc@def.com', 'something@something.com', 'ghi@jkl.com']
otherarray = ['some', 'other', 'details']

from operator import itemgetter

res = [(i, j) for i, j in zip(emails, otherarray) if i!= 'something@something.com']
emails, otherarray = map(list, map(itemgetter(0, 1), zip(*res)))

print(emails)      # ['abc@def.com', 'ghi@jkl.com']
print(otherarray)  # ['some', 'details']
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.