【问题标题】:"add to set" returns a boolean in java - what about python?“添加到集合”在 java 中返回一个布尔值 - python 呢?
【发布时间】:2011-11-28 15:21:14
【问题描述】:

在 Java 中,我喜欢使用“添加到集合”操作返回的布尔值来测试该元素是否已经存在于集合中:

if (set.add("x")) {
   print "x was not yet in the set";
}

我的问题是,在 Python 中有没有这样方便的东西?我试过了

 z = set()
 if (z.add(y)):
     print something

但它不打印任何东西。我错过了什么吗?谢谢!

【问题讨论】:

  • 您可以在控制台中执行type(z.add(y)) 来亲自查看这些内容。这里的结果是<type 'NoneType'>

标签: java python set


【解决方案1】:

在 Python 中,set.add() 方法不返回任何内容。您必须使用not in 运算符:

z = set()
if y not in z: # If the object is not in the list yet...
    print something
z.add(y)

如果您真的需要在添加之前知道对象是否在集合中,只需存储布尔值即可:

z = set()
was_here = y not in z
z.add(y)
if was_here: # If the object was not in the list yet...
    print something

但是,我认为您不太可能需要它。

这是一个 Python 约定:当一个方法更新某个对象时,它返回None。你可以忽略这个约定;此外,还有一些“在野外”违反它的方法。然而,这是一个普遍的、公认的惯例:我建议您坚持并牢记这一点。

【讨论】:

  • 一个很好的答案,但我认为相当于 Java 的应该是 if y not in z: print something
  • @MichaelJ.Barber 你是完全正确的。谢谢!问题已更新。
  • 所以没有办法在一个操作中同时检查两者? Java 中的返回值非常适合性能关键场景,因为无论如何添加到集合都涉及查找。
【解决方案2】:

正如前面的答案中提到的,Python 集合的 add 方法不返回任何内容。顺便说一句,Python 邮件列表中讨论了这个确切的问题:http://mail.python.org/pipermail/python-ideas/2009-February/002877.html

【讨论】:

    【解决方案3】:

    通常,Python 会尽量避免使用具有副作用的条件。也就是说,条件应该只是一个测试,改变数据的操作应该自己发生。

    我同意有时在条件中使用副作用很方便,但不,在这种情况下,您需要:

    z = set()
    if y not in z:
        z.add(y)
        print something
    

    我个人喜欢if y not in z:的简单表达力,即使它占用了多行代码,并且在以后阅读代码时精神分析的事情更少。

    【讨论】:

      【解决方案4】:

      对于内置的set 类型,add() 总是返回None,但没有什么可以阻止您使用“更智能”的子类:

      class sset(set):
          """return True if on add if an object was really added (and not in yet)"""
          def add(self, val):
              if val in self:
                  return True
              set.add(self, val)
              return False
      

      这允许你写:

      s = sset()
      if s.add('1'):
          print('try 1')
      if s.add('1'):
          print('try 2')
      

      并在运行时打印try 2

      这可以防止重复多行代码,例如@brandizzi,这些代码很容易导致效率低下:

      z = set()
      was_here = y not in z
      z.add(y)
      if was_here: # If the object was not in the list yet...
          print something
      

      这是低效的,因为即使 y 已经添加了,它也应该是 类似:

      z = set()
      was_here = y not in z
      if not was_here:
          z.add(y)
      else: # If the object was not in the list yet...
          print something
      

      使用sset(),这可以简化为:

      z = sset()
      if z.add(y): # If the object was not in the list yet...
          print something
      

      【讨论】:

        【解决方案5】:

        我猜,在 Python 中基本上是在需要时将 y 添加到您的集合中,并且不返回任何内容。如果您想知道添加是否会改变任何内容,可以测试 y 是否已经在 z 中。

        您可以在 iPython 中进行一些测试:

        In [2]: z = set()
        
        In [3]: y = 4
        
        In [4]: z.add(y)
        
        In [5]: t = z.add(y)
        
        In [6]: t
        
        In [7]: print t
        None
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2015-02-14
          • 2021-05-04
          • 2014-05-16
          • 1970-01-01
          • 2012-08-18
          • 2013-03-28
          • 1970-01-01
          • 2020-12-28
          相关资源
          最近更新 更多