从集合中删除一个元素并返回该集合。

3
我需要迭代一个不包含某个元素的集合副本。到目前为止,我的做法是:
for element in myset:
    if element != myelement:
       ...

但我想要像这样的东西,一行代码实现:

for element in myset.copy().remove(myelement):
    ...

很明显这不起作用,因为remove方法返回None。

你在寻找 difference() 吗?或许像这样 set([1,2,3]).difference(set([3])) - JonSG
您是否考虑编辑问题标题?“从集合中删除一个元素并返回该集合”暗示您想改变原始集合的内容,然而在阅读问题本身后,您明确表明您不想这样做(您需要的是已移除元素的副本)。 - slothrop
我认为标题很恰当,因为 OP 希望能够在集合上使用一种允许他们链接的方法。 - Grismar
@Grismar 完全同意,但是读标题时我以为 OP 寻找的是链式等价于 myset.remove(myelement) 而不是 myset.copy().remove(myelement)。也许我的大脑解析器是少数派! - slothrop
不,我认为你是对的 - 但标题应该吸引有同样问题的人,而且由于OP似乎不知道有什么可用的东西,所以我认为这是正确的。请看我的答案,我在那里解释了。 - Grismar
3个回答

7
使用集合差异运算符。
for element in myset - {myelement}:
    ...

这将创建一个新的集合,其中包含不在{myelement}中的myset元素(即myelement本身)。


这太酷了,我不知道它的存在。 - Daniel Garcia

4

这是你想要的吗?

myset = {1, 2, 3, 4}

for element in myset - {3}:
    print(element)

输出:

1
2
4

你说得对,remove() 在成功时返回的是 None 而不是结果集,它是就地操作而不支持链接。然而,像 - 这样的中缀运算符将被评估并返回结果。从某种意义上说,你可以把 set1 - set2 看作是 -(set1, set2),它确实返回了结果或者如果你喜欢的话,可以看作是 set1.-(set2)

事实上,这个方法是存在的:

myset = {1, 2, 3, 4}

for element in myset.difference({3}):
    print(element)

如果您查看Python关于集合的文档,它们主要从功能角度进行介绍,期望您使用中缀和前缀运算符以及函数。但是,像Python中的所有对象一样,set只是一个对象,并且具有与大多数(如果不是全部)运算符匹配的方法。

如果您有一个表达式,例如set1 - set2,那也是一个set,因此您甚至可以在其上调用方法:

print(({1, 2, 3} - {3, 4, 5}).union({9}))

用户@chepner在评论中正确指出,该方法使您可以提供除set之外的其他类型作为参数,例如tuple
myset = {1, 2, 3, 4}

for element in myset.difference((3,)):
    print(element)

这样可能会稍微更快一些,但请记住这种方法行不通:

myset = {1, 2, 3, 4}

for element in myset - (3,):
    print(element)

虽然使用元组调用.difference()可能更快,但如果代码速度真的很重要,你应该测试一下myset - {3}是否比myset.difference((3,))更快。尤其是因为你真正想做的事情可能并不是那么琐碎。


2
“difference” 还可以采用任意可迭代对象作为参数,这意味着你可以传递更快创建的 (3,) - chepner

0

使用过滤器

for element in filter(lambda x: x != element_to_ignore, element_list):
  do_stuff()

在看过其他答案后,我会选择使用集合差异来解决这个问题。 - Daniel Garcia

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