2015-06-25 16 views
21

üzerinde yinelemenin en pythonic yolu nedir? Bir OrderedDict var ve bir döngüde, indeks, anahtar ve değer almak istiyorum. OOrderedDict

a = collections.OrderedDict({…}) 
for i,b,c in zip(range(len(a)), a.iterkeys(), a.itervalues()): 
    … 

yani birden çok yolla yapılabilir katacaktır Ama aralığı önlemek istiyorum (len (a)) ve a.iteritems gibi bir şey için a.iterkeys(), a.itervalues ​​() kısaltmak(). enumerate ve iteritems ile o

for i,d in enumerate(a.iteritems()): 
    b,c = d 

olarak ifadeleri mümkündür Ama döngü vücudun içinde açmak için gereklidir. For ifadesini açmak veya yinelemenin daha zarif bir yolu var mı?

cevap

46

Sen for statement açtıktan tuple kullanabilirsiniz:

for i, (key, value) in enumerate(a.iteritems()): 
    # Do something with i, key, value 

>>> d = {'a': 'b'} 
>>> for i, (key, value) in enumerate(d.iteritems()): 
...  print i, key, value 
... 
0 a b 

Yan Not: Python 3.x ise

, bir iterable sözlük görünümünü verir dict.items() kullanın. Bana sorarsan

>>> for i, (key, value) in enumerate(d.items()): 
...  print(i, key, value) 
+0

Neden 'dict.items()' seçeneğini kullanmanızı öneriyorsunuz? Tam anlamıyla yeni bir liste oluşturur. – farukdgn

+0

@farukdgn, Python 3.x'te, 'dict.items()' bir görünümü değil, bir listeyi döndürür. Ve Python 3.x'te 'dict.iteritems' yoktur. [Sözlük görünümü] 'ne bakın (https://docs.python.org/3/glossary.html#term-dictionary-view). – falsetru

2
$ python 
Python 2.6.6 (r266:84292, Nov 21 2013, 10:50:32) 
[GCC 4.4.7 20120313 (Red Hat 4.4.7-4)] on linux2 
Type "help", "copyright", "credits" or "license" for more information. 
>>> import collections 
>>> a = collections.OrderedDict({'a':'1','b':'2'}) 
>>> a 
OrderedDict([('a', '1'), ('b', '2')]) 
>>> for i, (k,v) in enumerate(a.iteritems()): 
... print i, k, v 
... 
0 a 1 
1 b 2 

, çirkin mi.

Neden endeksle ilgilendiğinizi bilmiyorum. Dict arasındaki fikir, endeksten cahil olmanızdır. Dict ve kuyrukların arkasında çok fazla mantık var, bu sayede indekslerden arınmış olacağız.

Dizini almakta ısrar ederseniz iki kez yineleme yapmaya gerek yoktur.

en numaralandırmak listelerine ne görelim:

>>> seasons = ['Spring', 'Summer', 'Fall', 'Winter']  
>>> list(enumerate(seasons)) 
[(0, 'Spring'), (1, 'Summer'), (2, 'Fall'), (3, 'Winter')] 
>>> list(enumerate(seasons, start=1)) 
[(1, 'Spring'), (2, 'Summer'), (3, 'Fall'), (4, 'Winter')] 

Not "start".

Numaralandırma listeleri yönetmeyi bilir. Sözlükler, verileri canavarın göbeğinde bir yerde saklar. Öyleyse bir dikte ile numaralandırırsak ne olur? Zarif için giderdim Bu açıdan

>>> for i,k in enumerate(a): 
... print i,k 
... 
0 a 
1 b 

:

>>> for i,k in enumerate(a): 
... print i,k,a[k] 
... 
0 a 1 
1 b 2 

ben "i, (k, v) içinde" çok yakında iç yapının çok fazla açığa hissediyorum. "for i, k in" ile korunuyoruz ve zamanlar refakatçiye gelince, dönme şeklimize dokunmamız gerekmiyor. Sadece döngüde yaptığımız şeyi değiştirmeliyiz. Dikkat çekmek için daha az bir yönü.

Numaralandırmanın bu çağrısının 2'den sonra herhangi bir pythonda da aynı şekilde çalıştığından bahsetmiyorum.6 :)

https://docs.python.org/2/library/stdtypes.html#dict.iteritems

https://docs.python.org/2/library/functions.html#enumerate

+0

Siparişi bilen ancak isimleri önemsemeyen bir bileşenle arabirim kurmak için bir dizine ihtiyacım var. [] sayısını azaltmaya çalışıyorum, çünkü benim için sadece değerden değil, nesnelerin diktikleri ve bazı nesneler dizilerden oluşuyor ve her biri [] daha çok kodda acı çekiyor. Ve bir noktada, tüm iterkey'leri kodu kısaltan iteritemlere geri döndüm. Bu durumda, diktelerin listesini kullanmak daha doğal olabilir, ancak isimlere hızlı erişim ve saf dikte olan diğer varlıklarla tekdüzelik tutmayı tercih ettim. –

+0

Benim için bir dikte dikte dikte dikte bir dict listesi, şimdi sizin özel durumunuza bağlıdır. Bir Tanrı Nesnesi olduğunu hissediyor. – Andrei

0

kullanan yöntemleri values veya items bir view alma ve daha sonra bir iterator olarak dizmek:

ör Hesabınızdaki değerlere göre sıralamak için

sorted(iter(my_dict.values())) 
İlgili konular