3

このオブジェクトを想像してください:

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

タグのセットを作成したい:

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

ただし、e定義されていないため機能しません。どうすればできますか??

4

2 に答える 2

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

順序を変更して最初に e を取得する必要があります... :)

于 2012-10-05T04:46:35.893 に答える
3

これらの入れ子になった内包表記に混乱しないようにするための秘訣は、内包表記に現れる順序でループを展開することです。

したがって、あなたの例では、ジェネックスがあります:

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

次のように、精神的に二重ループに展開できます。

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

そして今、この構造を使用すると、エラーがどこにあるかが明確にわかり、e未定義であり、実際にはそうあるべきであることがわかります。

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

ネストされた理解に戻ります

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

以前の回答からすでに見たように。お役に立てれば!

于 2012-10-05T05:20:53.040 に答える