2014-12-11 13 views
7

Mi chiedevo se esistesse un modo chiaro/conciso per aggiungere qualcosa a un set e controllare se è stato aggiunto senza gli hash 2x & ricerche.Python: come verificare se un elemento è stato aggiunto a un set, senza 2x (hash, ricerca)

questo è quello che si potrebbe fare, ma ha dispone di voce

if item not in some_set: # <-- hash & lookup 
    some_set.add(item) # <-- hash & lookup, to check the item already is in the set 

    other_task() 

Questo funziona con un unico hash e di ricerca, ma è un po 'brutto 2x hash.

some_set_len = len(some_set) 
some_set.add(item) 
if some_set_len != len(some_set): 

    other_task() 

C'è un modo migliore per farlo utilizzando l'API di Python?

+0

@PadraicCunningham: il problema è 'other_task()'. – DSM

+0

Forse dovrai implementare la tua classe impostata. – kist

+0

Il metodo 'add' fa già questo test per te, quindi basta chiamarlo. –

risposta

9

Non penso che ci sia un modo integrato per farlo. Si potrebbe, naturalmente, scrivere la propria funzione:

def do_add(s, x): 
    l = len(s) 
    s.add(x) 
    return len(s) != l 

s = set() 
print(do_add(s, 1)) 
print(do_add(s, 2)) 
print(do_add(s, 1)) 
print(do_add(s, 2)) 
print(do_add(s, 4)) 

O, se si preferisce criptiche one-liner:

def do_add(s, x): 
    return len(s) != (s.add(x) or len(s)) 

(Questo si basa su l'ordine di valutazione da sinistra a destra e sul fatto che set.add() restituisce sempre None, che è Falsey.)

Tutto questo a parte, vorrei solo in considerazione fare questo se il doppio hashing/ricerca è palesemente un collo di bottiglia e se si utilizza un functio n è dimostrabilmente più veloce.

+4

+ = 1, ma onicker criptico solo * ha * per essere un 'lambda' per l'illeggibilità extra. – ch3ka

+0

@ ch3ka: lol! :) – NPE

+1

'lambda l, I: l .__ len __()! = (L.add (I) o l .__ len __())' – ch3ka

Problemi correlati