2011-11-28 9 views
5

En Java me gusta usar el valor booleano devuelto por una operación de "añadir al conjunto" para probar si el elemento ya estaba presente en el conjunto:"agregar al conjunto" devuelve un booleano en java - ¿qué pasa con python?

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

Mi pregunta es, ¿hay algo tan conveniente en ¿Pitón? Intenté

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

Pero no imprime nada. ¿Me estoy perdiendo de algo? ¡Gracias!

+2

puedes hacer 'type (z.add (y))' en la consola para ver estas cosas por ti mismo. El resultado aquí es '' – Oliver

Respuesta

7

En Python, el método set.add() no devuelve nada. Usted tiene que utilizar el not in operador:

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

Si realmente necesidad de saber si el objeto estaba en el set antes de agregar que, simplemente almacenar el valor booleano:

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 

Sin embargo, Creo que es poco probable que lo necesites.

Esta es una convención de Python: cuando un método actualiza algún objeto, devuelve None. Puedes ignorar esta convención; también, hay métodos "en la naturaleza" que lo violan. Sin embargo, es una convención común y reconocida: recomendaría atenerme a ella y tenerla en cuenta.

+0

Una buena respuesta, pero creo que el equivalente a Java sería 'si y no en z: imprime algo'. –

+0

@ MichaelJ.Barber tiene toda la razón. ¡Gracias! Pregunta actualizada – brandizzi

0

Supongo que en Python básicamente se agrega y a su conjunto si es necesario y no devuelve nada. Puede probar si y ya está en z si desea saber si el complemento cambiará algo.

Aquí algunas pruebas que se pueden hacer en 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 
2

En general, Python trata de evitar el uso de condiciones con los efectos secundarios. Es decir, la condición debería ser solo una prueba, y las operaciones que cambian los datos deberían suceder por sí mismas.

estoy de acuerdo que a veces es conveniente utilizar un efecto secundario en una condición, pero no, en este caso, es necesario:

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

Personalmente me gusta la sencilla expresividad de if y not in z:, incluso si ocupa una línea más de código, y es una cosa menos analizar mentalmente al leer el código en una fecha posterior.

0

Para el incorporado en set tipo, add() siempre da vuelta None, pero no hay nada que le impida el uso de una subclase "inteligente":

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 

Esto le permite escribir:

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

y obtenga try 2 impreso cuando se ejecuta.

Esto evita que repiten varias líneas de código como @ de Brandizzi que pueden contener fácilmente ineficiencias:.

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 

que es ineficiente y se añade incluso si ya está en Debería ser algo como:

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 

con sset() esto se puede reducir a:

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