0

リストのリストがある場合:

super_list = [[0, 1, 2, 3, 4], [5, 6, 7, 8, 9]]

そして、次のように記述した内部要素を繰り返し処理します。

for sub_list in super_list:
    for item in sub_list:
        print item

私たちはこれを持っているつもりです:

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

しかし、'generator' 構文を使用したい場合:

for item in (sub_list for sub_list in super_list):
    print item

私たちはこれを持っているつもりです:

# [0, 1, 2, 3, 4]
# [5, 6, 7, 8, 9]

私の質問は:なぜですか?ジェネレーターで正確に何が起こっているのでしょうか?

前もって感謝します!

4

2 に答える 2

4

ジェネレーターはサブリストをループしません。外側のリストからアイテムを生成するだけです。forループは、ジェネレーターが生成するアイテムをループするのではなく、ジェネレーター自体をループします

余分なレベルを追加する必要があります:

for item in (item for sub_list in super_list for item in sub_list):

これは、ジェネレーターを変数に割り当ててから使用すると確認できますnext()

>>> super_list = [[0, 1, 2, 3, 4], [5, 6, 7, 8, 9]]
>>> gen = (sub_list for sub_list in super_list for item in sub_list)
>>> next(gen)
[0, 1, 2, 3, 4]
>>> gen = (item for sub_list in super_list for item in sub_list)
>>> next(gen)
0
>>> for item in (item for sub_list in super_list for item in sub_list):
...     print item
... 
0
1
2
3
4
5
6
7
8
9
于 2013-05-23T17:18:04.957 に答える