在Python中删除数组元素

3

大家好,我想从一个数组中删除另一个数组特定的元素。下面是一个例子,实际上这两个数组都是由很多单词组成的。

A = ['at','in','the']
B = ['verification','at','done','on','theresa']

我希望您能从B中删除在A中出现的单词。
B = ['verification','done','theresa']

以下是我迄今为止尝试过的:

for word in A:
    for word in B:
        B = B.replace(word,"")

我遇到了一个错误:

AttributeError: 'list' object has no attribute 'replace'

我应该使用什么方法来解决?

3个回答

3
使用列表推导式获取完整答案:
[x for x in B if x not in A]

然而,您可能想了解更多关于replace的信息,因此...

Python列表没有replace方法。如果您只想从列表中删除一个元素,请将相关切片设置为空列表。例如:

>>> print B
['verification', 'at', 'done', 'on', 'theresa']
>>> x=B.index('at')
>>> B[x:x+1] = []
>>> print B
['verification', 'done', 'on', 'theresa']

请注意,尝试使用值B[x]来做同样的事情将不会从列表中删除元素。

2
另外,B.pop(x) 或者更好的 B.remove('at') 在这里都可以使用。 - Patrick Perini
B[x:x+1] = [] -> del B[x:x+1] B[x:x+1] = [] 表示将列表 B 中下标从 x 到 x+1 的元素赋值为空列表,而 del B[x:x+1] 则表示删除列表 B 中下标从 x 到 x+1 的元素。 - warvariuc
1
@Patrick 展示这种数组技术的一个额外好处是,同一形式可以用于插入多个元素。例如,x=[1,2,3];x[1:2]=[5,6,7];x 返回 [1,5,6,7,3] - Foo Bah

3

如果您可以删除B中的重复项并不关心顺序,则可以使用集合:

>>> A = ['at','in','the']
>>> B = ['verification','at','done','on','theresa']
>>> list(set(B).difference(A))
['on', 'done', 'theresa', 'verification']

在这种情况下,使用集合进行查找比使用列表要快得多,因此您将获得显着的加速。实际上,在这种情况下,最好将A和B设置为集合。

“在集合中查找比在字典中快得多”-- 我不太确定你的意思,因为我没有在其他答案中看到字典,但是在集合中查找基本上与在字典中进行键查找相同。 - agf
我认为他的意思是“在集合中查找比在列表中快得多”。问题是关于列表的,每个人都在谈论列表,这样说是正确的。 - steveha
你说得对,这一切都与列表有关。在列表中查找的时间复杂度是O(n),而在集合/字典中查找的时间复杂度是O(1)。 - Marat
然而结果的顺序将会改变。 - OneOfOne

1

你也可以尝试从B中移除元素,例如:

A = ['at','in','the']
B = ['verification','at','done','on','theresa']
print B
for w in A:
    #since it can throw an exception if the word isn't in B
    try: B.remove(w)
    except: pass
print B

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接