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)的结果发生了变化。确切地说,第二个列表(组)没有。我只是无法找出原因。为什么? (我的英语不太好,我希望你能理解我的要求)
答案 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()
一次,然后重复使用结果。