如何从元组列表中删除元素?

3
我想删除Python中的元组列表。 我有一个列表: l = [('name','sam'),('age', 20),('sex', 'male')] 还有另一个元组列表: r = [('name','sam'),('age', 20)] 我试图删除那些在rl中都存在的元素。 我正在这样做:
for item in l:
   if item in r:
       del item

但是元素并没有被删除。输出为空,并且当我打印修改后的列表时: >>> l 原始列表被打印出来。 [('name','sam'),('age', 20),('sex', 'male')] 请帮助我,如何从元组列表中删除元素。

1
观察到的行为原因是,使用 for item in l 会创建对每个列表项的(临时)引用,并且删除该引用不会影响列表本身。此外,尝试在 for 循环中修改正在循环的列表始终是一个坏主意。 - PeterE
4个回答

3
你可以将这两个列表转换为集合,然后进行差集运算:
l = [('name','sam'),('age', 20),('sex', 'male')]
r = [('name','sam'),('age', 20)]

以下代码将仅返回在l中,但不在r中的元素:
set(l) - set(r)

好的回答,但我认为它并没有完全做到他所描述的。特别是当l中的项目不唯一时,您的代码也会删除重复项。这可能是他真正想要的,也可能不是。 - kdani

0
你可以使用 filter()
for item in filter(lambda x: x not in r, l):
    # You can use your items here

# The list gets out of scope, so if there are no other references,
# the garbage collector will destroy it anyway

或者,如果您还需要在其他地方使用该列表,您也可以考虑创建一个新的列表,使用列表推导式:

l = [i for i in l if i not in r]

0

这将返回一个列表,其中包含在l中但不在r中的项目。

此解决方案与减去集合的解决方案之间的区别在于,如果您的列表中有重复项,则不会丢失信息。使用减去集合会丢失此信息。

difference = [item for item in l if item not in r]

0

有许多方法可以解决这个问题:

  1. 通过使用 l 和 r 找到列表的 AND,找出两者共同的部分,然后以这种方式进行操作:[x for x in l if x not in l and r ]。这比上面的答案要更有效率一些。

  2. 正确标记的答案在某些情况下会失效,例如如果 len(l) < len(r)。为了克服这个问题,只需执行以下操作: list=[] p = l and r list.extend([ [x for x in l if x not in p ], [x for x in r if x not in p ]]) 希望它能消除一些未知因素。


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