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
答案 0 :(得分:4)
如果你想要一个单行,你可以使用or
到add
元素只有当它不是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,如果不是