Python相当于Java的Set.add()?

时间:2016-07-25 08:47:22

标签: java python set

Java的Set.add函数将返回一个布尔值,如果该集合尚未包含指定的元素,则为true

Python的Set.add没有返回值。

似乎在Python中如果我想做同样的事情,我必须先检查它是否在集合中,然后再添加它。

有没有更简单的方法(最好是单行)?

价:
https://docs.oracle.com/javase/7/docs/api/java/util/Set.html#add(E) https://docs.python.org/2/library/sets.html#sets.Set

4 个答案:

答案 0 :(得分:4)

如果你想要一个单行,你可以使用oradd元素只有当它不是in集合(短路评估)和{{ 1}}反转返回的值,同时强制转换为not,将bool返回的None(如果被调用)转换为add,否则只是反转True检查结果:

in

但是,由于单行可能不容易掌握,并且你必须写入要插入两次的值,你应该把它作为一个函数,然后它使用了多少行无关紧要

>>> s = set()
>>> not(42 in s or s.add(42))
True
>>> not(42 in s or s.add(42))
False
>>> s
set([42])

答案 1 :(得分:3)

不,Python的set实现没有这样的方法;如你所知,你必须分别测试存在感:

if obj not in setobj:
    setobj.add(obj)

或者,我通常做的事情:

if obj in setobj:
    return  # or break out of a loop, etc.

# handle the case where the set doesn't have the object yet.

您始终可以继承set类型:

class SetWithPresenceCheck(set):
    def add(self, value):
        not_present = value not in self
        super(SetWithPresenceCheck, self).add(value)
        return not_present

请注意,Set.add()返回布尔值的真正原因是添加和测试原子操作;接口的实现可以(可选地)使方法同步并让呼叫者避免竞争条件。 Python的内置集不会产生任何线程安全承诺无论如何

答案 2 :(得分:-1)

联合运算符比无论如何都要快得多。

>>> set_a = set('pqrs')
>>> set_b = ['t', 'u', 'v']
>>> set_a |= set(set_b)
>>> set_a
set(['p','q','r','s','t','u','v'])

答案 3 :(得分:-1)

可能使用三元条件运算符:

the_set.add(what_ever) or True if what_ever not in the_set else False

如果what_ever在集合中,则返回False,如果不是

,则返回True