python'daki sözlük için numaralandır ()


85

enumerateListeyi yinelemek için kullandığımızı biliyorum ama bir sözlükte denedim ve bir hata vermedi.

KOD:

enumm = {0: 1, 1: 2, 2: 3, 4: 4, 5: 5, 6: 6, 7: 7}

for i, j in enumerate(enumm):
    print(i, j)

ÇIKTI:

0 0

1 1

2 2

3 4

4 5

5 6

6 7

Birisi çıktıyı açıklayabilir mi?


2
for i, j in enumerate(enumm) gets iher işleminde artırılır ve jher zamanki öğeyi yakalar enumeratebu durumda bir sözlük olan fonksiyon argüman. Diktleri yinelemek, esasen anahtarları üzerinde yinelemektir.
Divyanshu Srivastava

Yanıtlar:


120

Python'da zaten verilen cevapların yanı sıra, bir sözlüğün hem anahtarlarını hem de değerlerini sıralamanıza izin veren çok hoş bir kalıp vardır.

Sözlüğün anahtarlarını numaralandırdığınız normal durum :

example_dict = {1:'a', 2:'b', 3:'c', 4:'d'}

for i, k in enumerate(example_dict):
    print(i, k)

Hangi çıktılar:

0 1
1 2
2 3
3 4

Ancak , hem anahtarlar hem de değerler aracılığıyla numaralandırmak istiyorsanız , şu şekilde:

for i, (k, v) in enumerate(example_dict.items()):
    print(i, k, v)

Hangi çıktılar:

0 1 a
1 2 b
2 3 c
3 4 d

1
(+1) Ayrıca dictionary.items(), demet listesi olarak anahtar-değer çiftlerine sahip bir görünüm nesnesi elde etmek için (numaralandırmadan) kullanabilirsiniz.
Tiago Martins Peres 李大仁

62

İlk çıktı sütunu, içindeki her bir öğenin dizinidir enummve ikincisi ise anahtarlarıdır. Sözlüğünüzü yinelemek istiyorsanız .items () kullanın:

for k, v in enumm.items():
    print(k, v)

Ve çıktı şöyle görünmelidir:

0 1
1 2
2 3
4 4 
5 5
6 6
7 7

33

Bir sözlüğün dizini, anahtarı ve değerlerini numaralandırmak isterseniz, for döngünüz şöyle görünmelidir:

for index, (key, value) in enumerate(your_dict.items()):
    print(index, key, value)

3
Bu soru, sözdizimi ile ilgili konularla ilgilidir ve bu yanıt, eklenen iki parantezin en kısa çözümünü sağladı:idx, (k, v) in enumerate(d.items()):
Sean Pianka

1
Merhaba Sean, cevaba katılıp katılmadığından emin değilim veya sadece daha kısa değişken isimlerinin daha iyi bir cevap olduğunu mu söylüyorsun?
Jordan Mackie

26
dict1={'a':1, 'b':'banana'}

Sözlüğü Python 2.x'te listelemek için:

for k,v in dict1.iteritems():
        print k,v 

Python 3.x'te şunları kullanın:

for k,v in dict1.items():
        print(k,v)
# a 1
# b banana

Son olarak, diğerlerinin de belirttiği gibi, çalışan bir dizin istiyorsanız, buna da sahip olabilirsiniz:

for i  in enumerate(dict1.items()):
   print(i)  

 # (0, ('a', 1))
 # (1, ('b', 'banana'))

Ancak bu , telefon rehberi tarzı arama için verimli bir veri yapısı olan bir sözlüğün (harita, ilişkilendirilebilir dizi) amacını bozar . Sözlük sıralaması uygulama için tesadüfi olabilir ve buna güvenilmemelidir. Siparişe ihtiyacınız varsa bunun yerine OrderedDict'i kullanın.


2
Bu yazıda 2 karakterli bir düzenleme yapmama izin vermiyor, ancak OP bunu Python 3 için olarak etiketledi, bu nedenle print deyiminin k, v etrafında parantez olması gerekiyor.
wp-overwatch.com

@Bay. Ben, Ty, düzelteceğim.
roadrunner66

19
Bunun yalnızca python2 için mevcut olduğuna dikkat edilmelidir. dict.iteritems () python3'te kaldırıldı, ayrıca bkz. stackoverflow.com/questions/30418481/…
gyger

1
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
lkahtz

Ty. Python3 ile python2 karşılaştırması güncellendi. Numaralandırmaya yorum eklendi.
roadrunner66

5

Bu enumeratenedenle kullandığınız için i, aslında anahtarın kendisinden çok anahtarın dizinidir.

Yani, anahtar olmasa bile 3satırın ilk sütununa 3 4giriyorsunuz 3.

enumerate Mevcut yineleme numarasını sağlarken bir veri yapısı (liste veya sözlük olabilir) üzerinden yineler.

Bu nedenle, buradaki sütunlar, yineleme numarası ve ardından sözlükteki anahtar enum

Diğer Çözümler, anahtar ve değer çifti üzerinde nasıl yineleme yapılacağını zaten gösterdi, böylece benimkinde aynısını tekrarlamayacağım.


4

enumerate()liste üzerinde çalışırken aslında listedeki öğelerin indeksini ve değerini verir. Örneğin:

l = [1, 2, 3, 4, 5, 6, 7, 8, 9]
for i, j in enumerate(list):
    print(i, j)

verir

0 1
1 2
2 3
3 4
4 5
5 6
6 7
7 8
8 9

burada ilk sütun öğenin dizinini ve 2. sütun öğelerin kendisini gösterir.

Sözlükte

enumm = {0: 1, 1: 2, 2: 3, 4: 4, 5: 5, 6: 6, 7: 7}
for i, j in enumerate(enumm):
    print(i, j)

çıktı verir

0 0
1 1
2 2
3 4
4 5
5 6
6 7

burada ilk sütun key:valueçiftlerin dizinini verir ve ikinci sütun keyssözlüğün değerini gösterir enumm.

İsterseniz Yani ilk sütun olmak keysolarak ve ikinci sütun valuesdenemek daha iyi, dict.iteritems()(Python 2) veya dict.items()(Python 3)

for i, j in enumm.items():
    print(i, j)

çıktı

0 1
1 2
2 3
4 4
5 5
6 6
7 7

Voila


1
Bu sözlükler için geçerli değil. Kodunuz, bir dizin kullanarak (yineleme için) sözlük üzerinde yinelenecek, ancak sözlüğün anahtar-değer kombinasyonlarını vermeyecektir. Bunun yerine dict.items () kullanın.
Matthias

evet ayrıca dict.items () ile de devam edebilirsiniz. Düzeltme için teşekkürler.
Abhishek Roy

3

Bu kesinlikle kafa karıştırıcı görünüyor olmalı. Demek olan bu. Numaralandırmanın ilk değeri (bu durumda i), 0'dan başlayan bir sonraki indeks değerini döndürür, bu nedenle 0, 1, 2, 3, ... Numaralandırmanın ikinci değeri (bu durumda j), sözlüğünüzdeki / numaralandırmanızdaki değerleri döndürmektir (biz buna Python'da sözlük diyoruz). Gerçekten yapmak istediğiniz, roadrunner66'nın yanıt verdiği şeydir.


3
  1. Bir Python diktesini yinelemek, anahtarları üzerinde tam olarak olduğu gibi dict.keys()
  2. Anahtarların sırası, uygulama kodu tarafından belirlenir ve belirli bir düzen bekleyemezsiniz:

    Anahtarlar ve değerler, rastgele olmayan, Python uygulamalarına göre değişen ve sözlüğün ekleme ve silme geçmişine bağlı olan rastgele bir sırada yinelenir. Anahtarlar, değerler ve öğe görünümleri, sözlükte araya giren değişiklikler olmadan yinelenirse, öğelerin sırası doğrudan karşılık gelir.

Bu nedenle ilk sütunda 0'dan 7'ye kadar olan indisleri görüyorsunuz. Tarafından üretilirler enumerateve her zaman doğru sıradadırlar. Ayrıca ikinci sütunda diktenin 0-7 arasındaki anahtarlarını görürsünüz. Sıralanmamışlar.


3

Python3:

Bir çözüm:

enumm = {0: 1, 1: 2, 2: 3, 4: 4, 5: 5, 6: 6, 7: 7}
for i, k in enumerate(enumm):
    print("{}) d.key={}, d.value={}".format(i, k, enumm[k]))

Output:
0) enumm.key=0, enumm.value=1
1) enumm.key=1, enumm.value=2
2) enumm.key=2, enumm.value=3
3) enumm.key=4, enumm.value=4
4) enumm.key=5, enumm.value=5
5) enumm.key=6, enumm.value=6
6) enumm.key=7, enumm.value=7

Başka bir örnek:

d = {1 : {'a': 1, 'b' : 2, 'c' : 3},
     2 : {'a': 10, 'b' : 20, 'c' : 30}
    }    
for i, k in enumerate(d):
        print("{}) key={}, value={}".format(i, k, d[k])

Output:    
    0) key=1, value={'a': 1, 'b': 2, 'c': 3}
    1) key=2, value={'a': 10, 'b': 20, 'c': 30}

1
d = {0: 'zero', '0': 'ZERO', 1: 'one', '1': 'ONE'}

print("List of enumerated d= ", list(enumerate(d.items())))

çıktı:

List of enumerated d=  [(0, (0, 'zero')), (1, ('0', 'ZERO')), (2, (1, 'one')), (3, ('1', 'ONE'))]

0

Anahtarın içine dizin eklemeyi yararlı bulabilirsiniz:

d = {'a': 1, 'b': 2}
d = {(i, k): v for i, (k, v) in enumerate(d.items())}

Çıktı:

{(0, 'a'): True, (1, 'b'): False}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.