16

Python 3'te iç içe sözlük anlamalarını anlamada sorun yaşıyorum. Aşağıdaki örnekten aldığım sonuç hatasız yapıyı hatasız olarak veriyor, ancak yalnızca iç anahtarlardan birini içeriyor: değer çiftleri. Bunun gibi iç içe geçmiş bir sözlük anlama örneği bulamadım; Googling "iç içe sözlük anlama python", eski örnekleri, yuvalanmamış anlamaları veya farklı bir yaklaşım kullanarak çözülmüş cevapları gösterir. Yanlış sözdizimini kullanıyor olabilirim.İç içe geçmiş sözlük python

Örnek:

data = {outer_k: {inner_k: myfunc(inner_v)} for outer_k, outer_v in outer_dict.items() for inner_k, inner_v in outer_v.items()} 

Bu örnek orjinal sözlük göndermez ancak, myfunc ile modifiye iç değere sahip olmalıdır.

outer_dict sözlüğün yapısı, hem de sonucu:

{outer_k: {inner_k: inner_v, ...}, ...} 

cevap

20

{inner_k: myfunc(inner_v)} bir sözlük anlama değil. Bu sadece bir sözlük.

Muhtemelen artık şöyle bir şey arıyoruz:

data = {outer_k: {inner_k: myfunc(inner_v) for inner_k, inner_v in outer_v.items()} for outer_k, outer_v in outer_dict.items()} 

okunabilirliği uğruna, sözlük comprehensions ve liste türetimi çok fazla iç içe yapmak.

+1

Çok teşekkür ederim - eğer bu herhangi birine yardımcı olursa, şaşkınlık yaratan bir nokta: Blender'in çözümünün benim ex çıkışımdan iki değişikliği var: hareket ettirilmiş bir parantez ve içten dışa 'for' koyması. İlk başta doğru olarak ayarlamak için yan tümce vardı, ancak yanlış yerde parantez ile, "NameError: global adı 'outer_v" tanımlıyordu. "Sonra aynı hatası" for' ile parantez içinde yanlış konumda Doğru bir yer –

20

bazı satır sonu ve girinti ekleme:

data = { 
    outer_k: {inner_k: myfunc(inner_v)} 
    for outer_k, outer_v in outer_dict.items() 
    for inner_k, inner_v in outer_v.items() 
} 

... Gerçekten tek, "2 boyutlu" dict anlama sahip apaçık ortaya koyuyor. Ne gerçekten istediğiniz muhtemelen:

data = { 
    outer_k: { 
     inner_k: myfunc(inner_v) 
     for inner_k, inner_v in outer_v.items() 
    } 
    for outer_k, outer_v in outer_dict.items() 
} 

(Blender eklenen boşluk ile onun cevabını önerdi tam olarak ne olduğu).

+0

Ayrıca çok yararlı.Örneğin, bir for döngü içinde bir eksen için bir dict comp kullanarak, ve estetik olarak satır tarafından kırmak için en iyi yolu kullanarak karşılaştırarak bakacağız. –

İlgili konular