Yanıtlar:
in
kesinlikle daha pitonik.
Aslında has_key()
Python 3.x'te kaldırıldı .
keys()
bir kopyadan ziyade sözlüğe sadece set benzeri bir görünümdür x in d.keys()
, O da (1). Yine de, x in d
daha Pythonic.
x in d.keys()
bellek ayırma ile tam bir geçici nesne inşa ve imha gerekir varsayalım x in d.keys()
. Bunun d.keys()
sadece 10 kat daha uzun olduğunu unutmayın , ki bu hala uzun değildir. Kontrol etmedim ama hala sadece O (1) olduğundan eminim.
in
sadece zarafetle değil (ve kullanımdan kaldırılmamış ;-) değil, aynı zamanda performansta da eller kazanır, örneğin:
$ python -mtimeit -s'd=dict.fromkeys(range(99))' '12 in d'
10000000 loops, best of 3: 0.0983 usec per loop
$ python -mtimeit -s'd=dict.fromkeys(range(99))' 'd.has_key(12)'
1000000 loops, best of 3: 0.21 usec per loop
Aşağıdaki gözlem her zaman doğru olmasa da, genellikle Python'da daha hızlı çözümün daha zarif ve Pythonic olduğunu fark edeceksiniz ; bu yüzden -mtimeit
ÇOK faydalı - sadece burada ve burada yüz nanosaniye tasarruf etmekle ilgili değil ! -)
has_key
de O (1) gibi görünüyor.
Python belgelerine göre :
has_key()
lehine itiraz edilmiştirkey in d
.
has_key()
Python 3'te kaldırıldı
Kullanım dict.has_key()
if (ve ancak) kodunuzu önceki 2.3 den (zaman Python sürümleri tarafından çalıştırılabilir olması gerekir key in dict
tanıtıldı).
in
Performansınızı gerçekten öldürdüğü bir örnek var .
Eğer kullanırsanız in
sadece uygular bir O'dan söz (1) konteyner __getitem__
ve has_key()
ancak __contains__
(gibi bir O (1) O (K) aramasına arama dönecek in
yoluyla doğrusal arama geri düşer __getitem__
).
Düzeltme açıkça önemsizdir:
def __contains__(self, x):
return self.has_key(x)
has_key()
olan Python 2 sözlüklere özgü . in
/ __contains__
kullanılacak doğru API'dir; tam bir taramanın kaçınılmaz olduğu kapsayıcılar için yine de birhas_key()
yöntem yoktur ve eğer O (1) yaklaşımı varsa, o zaman kullanıma özel olacaktır ve sorun için doğru veri türünü seçmek için geliştiriciye kadar.
has_key
bir sözlük yöntemidir, ancak in
herhangi bir koleksiyon üzerinde çalışır ve __contains__
eksik olsa bile , in
bulmak için koleksiyonu yinelemek için başka bir yöntem kullanır.
in
üzerinde testler yapmak oldukça verimlidir range
. xrange
Yine de Python 2'deki verimliliğinden emin değilim . ;)
__contains__
önemsiz bir şekilde hesaplayabilir .
range
her seferinde yeni bir örnek oluşturma yükünü içerir . Tek bir önceden var olan örnek kullanarak "aralıktaki tamsayı" testi zamanlamalarımda yaklaşık% 40 daha hızlı.
Dict.has_key () yöntemi kullanımdan kaldırıldı, 'in' kullanın - sublime text editor 3
Burada 'çağlar' adında bir sözlük örneği aldım -
ages = {}
# Add a couple of names to the dictionary
ages['Sue'] = 23
ages['Peter'] = 19
ages['Andrew'] = 78
ages['Karren'] = 45
# use of 'in' in if condition instead of function_name.has_key(key-name).
if 'Sue' in ages:
print "Sue is in the dictionary. She is", ages['Sue'], "years old"
else:
print "Sue is not in the dictionary"
Adam Parkin'in yorumlarıyla Alex Martelli'nin performans testlerini genişletiyor ...
$ python3.5 -mtimeit -s'd=dict.fromkeys(range( 99))' 'd.has_key(12)'
Traceback (most recent call last):
File "/usr/local/Cellar/python3/3.5.2_3/Frameworks/Python.framework/Versions/3.5/lib/python3.5/timeit.py", line 301, in main
x = t.timeit(number)
File "/usr/local/Cellar/python3/3.5.2_3/Frameworks/Python.framework/Versions/3.5/lib/python3.5/timeit.py", line 178, in timeit
timing = self.inner(it, self.timer)
File "<timeit-src>", line 6, in inner
d.has_key(12)
AttributeError: 'dict' object has no attribute 'has_key'
$ python2.7 -mtimeit -s'd=dict.fromkeys(range( 99))' 'd.has_key(12)'
10000000 loops, best of 3: 0.0872 usec per loop
$ python2.7 -mtimeit -s'd=dict.fromkeys(range(1999))' 'd.has_key(12)'
10000000 loops, best of 3: 0.0858 usec per loop
$ python3.5 -mtimeit -s'd=dict.fromkeys(range( 99))' '12 in d'
10000000 loops, best of 3: 0.031 usec per loop
$ python3.5 -mtimeit -s'd=dict.fromkeys(range(1999))' '12 in d'
10000000 loops, best of 3: 0.033 usec per loop
$ python3.5 -mtimeit -s'd=dict.fromkeys(range( 99))' '12 in d.keys()'
10000000 loops, best of 3: 0.115 usec per loop
$ python3.5 -mtimeit -s'd=dict.fromkeys(range(1999))' '12 in d.keys()'
10000000 loops, best of 3: 0.117 usec per loop
Böyle bir şey varsa:
t.has_key(ew)
Python 3.X ve üzeri sürümlerde çalıştırmak için aşağıdaki şekilde değiştirin:
key = ew
if key not in t
t.has_key(ew)
döndürür . değer sözlükte değilse döndürür . Dahası, takma ad çok, çok gereksizdir. Doğru yazım . Bu, 8 yıl önce kabul edilen cevabın size söylediği şeydir. True
ew
key not in t
True
key = ew
if ew in t