如何使用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 2011年

4
遍历列表时,请勿更改列表。
雅各布

我为什么不应该这样做?也对我不起作用。
locoboy

Answers:


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 2011年

编辑了我的答案。仍然不需要循环。
博格丹

1
您如何首先检查项目是否存在于initial_list中?在某些情况下,它可能不存在,您不必删除它。
locoboy

17

使用filter()and lambda将提供一种简洁的方法来删除不需要的值:

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

这不会修改电子邮件。它创建新列表newEmails,其中仅包含匿名函数为其返回True的元素。


5

如果需要在for循环中使用索引,则for循环不正确:

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

对于您而言,Bogdan解决方案是可以的,但是您选择的数据结构不是很好。必须用来自一个的数据与来自另一个的数据以相同的索引来维护这两个列表是笨拙的。

最好使用连音(电子邮件,其他数据)列表,或者以电子邮件为键的字典。


4

做到这一点的理智方法是使用zip()和List Comprehension / Generator表达式:

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

new_emails, new_other_list = zip(*filtered)

另外,如果您未使用array.array()numpy.array(),那么很可能您正在使用[]list(),这会为您提供列表,而不是数组。不一样的东西。


1
与@Bogdan的答案相比,还不确定这是“理智的”,后者要干净得多。
乔丹·拉普

感谢您指出数组与列表不同。所选答案不适用于2.7中的阵列。
EL_DON '02

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']
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.