Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/312.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何打开itertools“;石斑鱼;对象添加到列表中_Python_Itertools - Fatal编程技术网

Python 如何打开itertools“;石斑鱼;对象添加到列表中

Python 如何打开itertools“;石斑鱼;对象添加到列表中,python,itertools,Python,Itertools,我正在尝试学习如何在Python中使用itertools.groupby,我想找出每组字符的大小。起初,我试着看看是否能找到一组人的长度: from itertools import groupby len(list(list( groupby("cccccaaaaatttttsssssss") )[0][1])) 每次我都会得到0 我做了一点调查,发现其他人是这样做的: from itertools import groupby for key,grouper in groupby("ccc

我正在尝试学习如何在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"))
引自

返回的组本身是一个迭代器,它共享底层 可与
groupby()一起使用
。因为源是共享的,当
groupby()
对象是高级的,上一个组不再是高级的 看得见

让我们把它分成几个阶段

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?!
['p', 'y', 't', 'h', 'o', 'n']
[]
c 5
a 5
t 5
s 7
输出

[('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?!
['p', 'y', 't', 'h', 'o', 'n']
[]
c 5
a 5
t 5
s 7

顺便说一句,如果你实际上不需要一个
groupby
组的内容,这里有另一种方法可以得到它的长度;它比仅仅为了找到列表的长度而构建一个列表要便宜一些(并且使用更少的RAM)

from itertools import groupby

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

[('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?!
['p', 'y', 't', 'h', 'o', 'n']
[]
c 5
a 5
t 5
s 7

这是一个很好的解释。非常感谢!另一方面,这只是您想法的一个变体,如果您需要通过Antlr4通道保存输入的分区(我确实需要这样做),您可以执行类似于
groups=itertools.groupby(tokens.tokens,lambda token:token.channel)的操作;groups_list=[(k,list(grouper))表示k,grouper在组中]
。列表理解可能比Python循环快一点。