Python3中的迭代

时间:2016-03-30 14:39:42

标签: python list python-3.x iteration

Python 3.4.3 (default, Oct 14 2015, 20:28:29) 
[GCC 4.8.4] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> s="aaabbc"
>>> import itertools
>>> gs=itertools.groupby(s)
>>> for key, group in gs:
...   print(key, group)
...   print(list(group))
...   print(key, group, list(group))
... 
a <itertools._grouper object at 0x7fd246da3278>
['a', 'a', 'a']
a <itertools._grouper object at 0x7fd246da3278> []
b <itertools._grouper object at 0x7fd246da32e8>
['b', 'b']
b <itertools._grouper object at 0x7fd246da32e8> []
c <itertools._grouper object at 0x7fd246da39b0>
['c']
c <itertools._grouper object at 0x7fd246da39b0> []

正如代码所示,在上面的for循环中有一些惊人的东西:在一次迭代中,键和itertools._groupre对象没有改变,但是list(group)的结果发生了变化。确切地说,第二个列表(组)没有。我只是无法找出原因。为什么? (我的英语不太好,我希望你能理解我的要求)

1 个答案:

答案 0 :(得分:3)

生成器只能通过迭代group结果中的每个groupby()都是这样的生成器。在生成器上调用list()会导致它生成所有值,之后生成器耗尽,为空,无法重置;对同一个对象进行第二次list()调用然后只会产生一个空列表,因为生成器不再产生要放入列表的值。

list()的结果存储在新变量中:

for key, group in gs:
    group_result = list(group)
    print(key, group)
    print(group_result)
    print(key, group, group_result)

现在,您只需在生成器上调用list()一次,然后重复使用结果。