Wyobraź sobie ten obiekt:

my_obj = {
    'Episodes' : [
        {'Tags' : ['one','two','three']},
        {'Tags' : ['three','four','five']}
            ]
        }

Chcę utworzyć zestaw tagów:

tags = set(tag for tag in e['Tags'] for e in my_obj['Episodes'])

Nie działa jednak, ponieważ e nie jest zdefiniowany. Jak mogę to zrobić??

3
MFB 5 październik 2012, 08:44

2 odpowiedzi

Najlepsza odpowiedź
tags = set(tag  for e in my_obj['Episodes'] for tag in e['Tags'])

Musisz zmienić zamówienie i uzyskać pierwszy ... :)

6
Joran Beasley 5 październik 2012, 04:46

Sztuczka, której używam, aby uniknąć zdezorientowanych przez te zagnieżdżone kompensacje, jest Rozwiń pętlę w kolejności, w którym pojawia się w rozumieniu .

W twoim przykładzie masz Genex:

tag for tag in e['Tags'] for e in my_obj['Episodes']

Które możesz mentalnie rozszerzyć w podwójną pętlę:

for tag in e['Tags']:
  for e in my_obj['Episodes']:
    yield tag

A teraz z tą strukturą możesz całkiem wyraźnie zobaczyć, gdzie jest twój błąd, z e jest niezdefiniowany i zobacz, że to powinno być:

for e in my_obj['Episodes']:
  for tag in e['Tags']:
    yield tag 

Co załamuje się do zagnieżdżonego zrozumienia

tag for e in my_obj['Episodes'] for tag in e['Tags']

Jak już widziałeś z poprzednich odpowiedzi. Mam nadzieję że to pomoże!

2
wim 5 październik 2012, 05:20