2016-07-25 29 views
1

Java的Set.add函数将返回一个布尔值,如果该集合尚未包含指定元素,则返回truePython的相当于Java的Set.add()?

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

在Python中,如果你添加了一些已经在集合中的东西,它不会添加一个副本。 – pwnsauce

+1

@pwnsauce:它也不会在Java中。但是'Set.add()'方法告诉你该元素是否已经存在,这可以简化代码。当然,当谈到代码简单性时,Java需要所有的帮助。 –

回答

3

,你可以使用oradd该元素只有当它不是已经in设置(短路评估)和not来反转返回值并且同时强制到bool,turni NG的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]) 

然而,由于一个班轮可能不是很容易掌握,你必须写入要插入的值两次,您应该将其作为函数,然后使用它的线数并不重要。

def in_or_add(s, x): 
    return not(x in s or s.add(x)) 
2

不,Python的一套执行有没有这样的方法;正如你指出你必须单独测试存在:

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的内置集合无论如何都不会产生任何线程安全承诺

-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']) 
+0

联合在添加之前不会告诉您元素是否存在。为什么要创建一整套,如果你想要做的就是添加**一个**元素? –

+0

@MartijnPieters:tue,但是OP想要将元素添加到集合中。联盟将为他的目的服务。 – Shravan40

+0

不,OP要在被添加*一步*时被告知一个元素是否已经存在。 –

-1

可能与三元条件运算符:

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

如果你想要一个班轮这将返回false,如果what_ever是一套,真正的如果不是

+0

这是无效的语法。赋值('bool_already_in = True')是*语句*,不是表达式,不能嵌套在另一个表达式中。 –

+1

所以现在你需要在单独的语句中测试'None'或'False'。这不比单独的遏制检查更有帮助。 –

+0

@MartijnPieters是的,但是你将不得不在'java:set.add()'no中做同样的事情? set.add()添加值,如果它不在集合中,并返回True或False的权利?就像这样 – pwnsauce