2016-03-23 16 views
2

Bir sözlükteki anahtarların for döngüsüne tam olarak nasıl eriştiğini merak ediyordum? dict.keys()'u çağırır ve bu listeyi tekrarlar mı?`for` döngüsü sözlükte özellikle çalışmaktadır

soruyorum nedenim, bir Sözlüğün anahtarı, herhangi bir tuşa sorgulamak istiyorum, ve çağıran arasındaki (görsel ve okunabilirlik kenara) performansında bir fark olup olmadığını merak ediyorum:

for key in dict: 
    my_func(dict[key]) 
    break 

ve yukarıdaki soruya götürdü

my_func(dict.keys()[0]) 

- piton başlık altında, özellikle dict s tarihinde bir for döngü sırasında ne yapar?

+0

'dict [key]' dict.keys() 'aynıdır [0] ' 'dict [key] 'in bir değer döndürmesi beklenirken, dict.keys() [0]' bir anahtar döndürmesi beklenirken, – Hacketo

+1

[PEP 234]' deki yineleyici protokolüne bakın (https: //www.python .org/dev/peps/pep-0234 /) – miradulo

+0

Soruyor musunuz, söylüyorsunuz mu? 'Dicts' un sıralanmadığı için, kaza ya da şans ya da her ne olursa olsun, aynı olmazlardı. – nlsdfnbch

cevap

2

dict yinelenen dict.key() numaralı telefonu aramaz. Sözlüğün kendisi yinelemeyi destekler.

>>> iter({'name': 'value'}) 
<dict_keyiterator object at 0x7f127da89688> 

BTW, Python 3.x dict.keys indeksleme desteklemediği Sözlük anahtar görünümü verir. Eğer herhangi bir tuşa almak istiyorsanız

>>> {'name': 'value'}.keys() 
dict_keys(['name']) 
>>> {'name': 'value'}.keys()[0] 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
TypeError: 'dict_keys' object does not support indexing 

kullanabileceğiniz next, iter:

>>> next(iter({'name': 'value', 'name2': 'another value'})) 
'name' 

>>> next(iter({})) # <-- To handle empty case, pass default value 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
StopIteration 
>>> next(iter({}), 'default value') 
'default value' 
+0

Ah, şerefe. Konsol çıkışım orada kafamı karıştırdı. – nlsdfnbch

İlgili konular