gpt4 book ai didi

python - `list(itertools.groupy)` 的违反直觉的行为

转载 作者:行者123 更新时间:2023-11-28 17:07:20 26 4
gpt4 key购买 nike

<分区>

让我演示一下。它咬了我两次,第一次我放弃了我无法理解 groupby 工作原理的想法。我正在使用“Python3.6”。

我有一个 x.y 格式的元素列表,我想按 y 分组。

a = ['1D.5', '2D.5', '3D.5', '1D.10', '2D.10', '3D.10', '1D.20', '2D.20', '3D.20', '1D.100', '2D.100', '3D.100']
groups = list(itertools.groupby(a, key=lambda x: x.split('.')[-1]))
for gname, glist in groups:
print(list(glist))

结果如下。

[]
[]
[]
['3D.100']

奇怪!

但是这有效。

groups = itertools.groupby(a, key=lambda x: x.split('.')[-1])
for gname, glist in groups:
print(list(glist))

['1D.5', '2D.5', '3D.5']
['1D.10', '2D.10', '3D.10']
['1D.20', '2D.20', '3D.20']
['1D.100', '2D.100', '3D.100']

不同之处在于这次我没有在 itertools.groupby 上调用 list。这种行为背后肯定有一些技术原因,但根据我对 python 生成器的经验,这是非常违反直觉的,而且可能是错误的!

为什么在迭代器上调用 list 会使其内容无效?

附言:groupby 的文档在其实现细节中有以下两行。

# [k for k, g in groupby('AAAABBBCCDAABBB')] --> A B C D A B
# [list(g) for k, g in groupby('AAAABBBCCD')] --> AAAA BBB CC D

我是否正确地怀疑 list(some generator) 不能保证给出与“等效”列表理解相同的结果?

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com