2014-12-11 7 views
7

Bir sete bir şey eklemenin açık/öz bir yolu olup olmadığını ve 2x karma olmadan eklendiğini kontrol etmeyi merak ediyorum & aramaları.Python: Bir öğeye 2x (karma, arama) olmadan bir öğenin eklenip eklenmediğini kontrol etme

bu ne yapabilir, ama vardır 2x karma en öğenin

ait
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() 

Bu, tek karma ve arama ile çalışır ama biraz çirkin.

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

    other_task() 

Python'un seti API kullanarak bunu yapmak için daha iyi bir yolu var mı?

+0

@PadraicCunningham: Sorun, other_task() 'dır. – DSM

+0

Belki kendi set sınıfınızı uygulamak zorunda kalacaksınız. – kist

+0

'add' yöntemi zaten sizin için bu testi yapıyor, sadece ara. –

cevap

9

Bunu yapmak için yerleşik bir yol olduğunu düşünmüyorum.

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

(Bu soldan sağa değerlendirme sırasına ve güvenir: Eğer şifreli bir gömlekler tercih ediyorsanız,

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)) 

Veya: Sen, elbette, kendi fonksiyonunu yazabiliriz bir functio kullanılıyorsa çift karma/arama kanıtlanabilirliği bir performans darboğazı ve ise set.add() hep None döndürür gerçeği, Falsey budur.) bir kenara

Bütün bunlar, sadece bunu düşünürdünüz n, kanıtlanabilir şekilde daha hızlıdır.

+4

+ = 1, ancak şifreli oneliner sadece * * fazladan erişilemezlik için bir “lambda” olacak *. – ch3ka

+0

@ ch3ka: lol! :) – NPE

+1

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