【问题标题】:Iteration in Python3 [closed]Python3中的迭代[关闭]
【发布时间】:2016-03-30 14:39:41
【问题描述】:
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 循环中有一些惊人的东西:在一次迭代中,key 和 itertools._groupre 对象没有改变,但是 list(group) 的结果发生了变化。确切地说,第二个列表(群) 没有。我只是不知道为什么。为什么? (我的英文不太好,希望你能明白我问的)

【问题讨论】:

  • 生成器只能生成它们的值一次。你没有得到None,你得到一个空列表,因为group 生成器已被第一个list() 调用耗尽。

标签: python list python-3.x iteration


【解决方案1】:

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

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

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

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

【讨论】:

  • 好的,它是一个生成器。我得到了它。我知道生成器只能迭代一次,但我没有发现那个组是生成器。从现在开始我会小心使用生成器。谢谢~
猜你喜欢
  • 2019-10-07
  • 1970-01-01
  • 1970-01-01
  • 2014-01-28
  • 2013-03-03
  • 1970-01-01
  • 2022-09-23
  • 2016-03-20
  • 1970-01-01
相关资源
最近更新 更多