gpt4 book ai didi

python - 如何将 itertools "grouper"对象变成列表

转载 作者:太空狗 更新时间:2023-10-29 20:49:01 25 4
gpt4 key购买 nike

我正在尝试学习如何在 Python 中使用 itertools.groupby,我想找到每组字符的大小。起初我试图看看我是否可以找到单个组的长度:

from itertools import groupby
len(list(list( groupby("cccccaaaaatttttsssssss") )[0][1]))

我每次都会得到 0。

我做了一些研究,发现其他人是这样做的:

from itertools import groupby
for key,grouper in groupby("cccccaaaaatttttsssssss"):
print key,len(list(grouper))

效果很好。我感到困惑的是为什么后面的代码有效,而前者却不行?如果我只想获得第 n 组,就像我在原始代码中尝试做的那样,我该怎么做?

最佳答案

您的第一种方法不起作用的原因是,当您使用

创建该列表时,这些组会被“消耗”
list(groupby("cccccaaaaatttttsssssss"))

引自the groupby docs

The returned group is itself an iterator that shares the underlying iterable with groupby(). Because the source is shared, when the groupby() object is advanced, the previous group is no longer visible.

让我们把它分成几个阶段。

from itertools import groupby

a = list(groupby("cccccaaaaatttttsssssss"))
print(a)
b = a[0][1]
print(b)
print('So far, so good')
print(list(b))
print('What?!')

输出

[('c', <itertools._grouper object at 0xb715104c>), ('a', <itertools._grouper object at 0xb715108c>), ('t', <itertools._grouper object at 0xb71510cc>), ('s', <itertools._grouper object at 0xb715110c>)]
<itertools._grouper object at 0xb715104c>
So far, so good
[]
What?!

我们在 0xb715104c 处的 itertools._grouper 对象 是空的,因为它与 groupby 返回的“父”迭代器共享其内容,而这些项目现在消失了,因为首先list 调用在父级上迭代。

这与尝试在任何迭代器(例如简单的生成器表达式)上迭代两次时发生的情况没有什么不同。

g = (c for c in 'python')
print(list(g))
print(list(g))

输出

['p', 'y', 't', 'h', 'o', 'n']
[]

顺便说一句,如果您实际上不需要它的内容,这是获取 groupby 组长度的另一种方法;它比构建一个列表只是为了找到它的长度要便宜一点(并且使用更少的 RAM)。

from itertools import groupby

for k, g in groupby("cccccaaaaatttttsssssss"):
print(k, sum(1 for _ in g))

输出

c 5
a 5
t 5
s 7

关于python - 如何将 itertools "grouper"对象变成列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44490079/

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