从集合中删除与列表中的元素匹配的元素

时间:2017-05-11 18:48:49

标签: python

我无法从集合中删除条目。

# Remove all out-of-stock items from our list
# This is O(n^3), unfortunately.
for x in oos:
    for asin in asins:
        if x == asin[0]:
            del asin

' asins'是一组元组,像这样创建:

asins.add(tuple((asin, c, s)))

oos是一个列表。我试图删除“asins'”中的所有条目。也存在于' oos中。不幸的是," del asin"实际上并不起作用,因为它不会删除“asins'”中的条目。

1 个答案:

答案 0 :(得分:3)

像这样使用的

del asin只会删除局部变量asin,而不会删除实际引用的对象,尤其不会删除集合中包含的对象。

相反,您需要调用set.remove来删除元素:

asins.remove(asin)

但是,您实际上并不需要遍历该集以从中删除项目。集合的全部好处是你有持续的时间访问权限,所以你可以在恒定的时间内检查成员资格,使循环很少有用。

由于您正在存储复杂元组,并且您只通过第一个元组元素标识元素,因此您不能在此处执行此操作。你应该做的是切换到更合适的集合。在您的情况下,您需要一本字典:

# convert your set of tuples to a dictionary
# ideally, you would store the data like this in the first place
asins = { asin[0]: asin for asin in asins }

然后您可以执行以下操作:

for x in oos:
    del asins[x] # here, you can use del

在平均情况下,这将是O(n)。