python - 用迭代器创建列表会产生意想不到的结果

标签 python python-3.x iterator

任何人都可以解释为什么迭代由迭代器 X 生成的列表与迭代迭代器 X 会产生不同的结果吗?

换句话说,[x for x in list(IteratorObject)] != [x for x in IteratorObject]

>>> randoms = [random.randrange(10) for i in range(100)]

>>> [ (x[0],list(x[1])) for x in itertools.groupby(sorted(randoms))]
[(0, [0, 0, 0, 0, 0, 0, 0, 0]), (1, [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]), (2, [2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2]), (3, [3, 3, 3, 3, 3, 3]), (4, [4, 4, 4, 4, 4, 4, 4, 4, 4, 4]), (5, [5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5]), (6, [6, 6, 6, 6, 6, 6, 6, 6, 6]), (7, [7, 7, 7, 7, 7]), (8, [8, 8, 8, 8, 8, 8, 8]), (9, [9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9])]

>>> [ (x[0],list(x[1])) for x in list(itertools.groupby(sorted(randoms)))]
[(0, []), (1, []), (2, []), (3, []), (4, []), (5, []), (6, []), (7, []), (8, []), (9, [9])]

>>> sys.version
'3.3.3 (default, Dec  2 2013, 01:40:21) \n[GCC 4.2.1 Compatible Apple LLVM 5.0 (clang-500.2.79)]'

最佳答案

我认为文档中的这一点解释了问题:

“返回的组本身就是一个迭代器,它与 groupby() 共享底层可迭代对象。由于源是共享的,因此当 groupby() 对象前进时,前一个组将不再可见。因此,如果该数据是以后需要时,应将其存储为列表”

在第二个示例中,当您转换为列表时,您会立即迭代所有组。但在每个组中,您不会迭代底层元素。当您最终尝试使用 list(x[1]) 执行此操作时,为时已晚 - 您已经用尽了迭代器。

关于python - 用迭代器创建列表会产生意想不到的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23691294/

相关文章:

python - 如何将列表中名称相似的元素分组为 python 中的元组?

python - Django后台线程

list - 了解 ML 中的 foldl

python - tkinter 按钮单击启动线程以防止 GUI 卡住

python - 使用 Python 格式化 HTML 到 JSON

python - 正则表达式对非捕获组的帮助

c++ - 通过迭代器打印出 map 的值

python - Django Rest 序列化程序 : Use nested serializer on GET but not POST

python - Sqlalchemy 关系 : Order children by joined table

java - 添加列表中包含的元素并将它们映射到字符串