itertools.groupby 返回错误的结果(这与排序无关)[重复]

Posted

技术标签:

【中文标题】itertools.groupby 返回错误的结果(这与排序无关)[重复]【英文标题】:itertools.groupby returning wrong result (this is not about sorting) [duplicate] 【发布时间】:2015-07-03 01:18:00 【问题描述】:

我想将一个字符串分解成单词,但保留单词开始的索引。例如,我想将'aaa bbb ccc' 转换为[(0, 'aaa'), (4, 'bbb'), (8, 'ccc')]这只是背景,不是问题

问题是我尝试使用 itertools.groupbystr.isalpha 作为键,但它给了我奇怪的结果。

这段代码显示了我在说什么(请忽略到处的list。我只是想确定我处理的是可迭代对象,而不是迭代器):

from itertools import groupby

text = 'aaa bbb ccc'

chars = list(groupby(list(enumerate(text)), lambda x: x[1].isalpha()))

result = [list(v) for k, v in chars if k] 

print result
assert result == [
        [(0, 'a'), (1, 'a'), (2, 'a')],
        [(4, 'b'), (5, 'b'), (6, 'b')],
        [(8, 'c'), (9, 'c'), (10, 'c')]]

变量result[[(10, 'c')], [], []] 结尾,我不知道为什么。也许我在这里遗漏了一些非常简单的东西,但我就是看不到它。

【问题讨论】:

你可以做print每一步来弄清楚 这没有多大帮助,因为itertools.groupby 创建的对象在打印时不会显示太多信息。这将只是一系列行<itertools._grouper at 0x7f12d72616d0> 不要在字符上使用list() 是的,这很简单。请@LittleQ,把它写成答案,这样我就可以接受了。 【参考方案1】:

更正代码:

chars = groupby(l, lambda x: x[1].isalpha())
result = [list(v) for k, v in chars if k]

找出奇怪的输出

>>> l = list(enumerate(text))

>>> chars = groupby(l, lambda x: x[1].isalpha())

>>> list(chars.next()[1])
[(0, 'a'), (1, 'a'), (2, 'a')]

>>> for k,v in list(chars): print list(v)
[]
[(10, 'c')]
[]
[]

list 将在groupby 中的子迭代器上生效

【讨论】:

以上是关于itertools.groupby 返回错误的结果(这与排序无关)[重复]的主要内容,如果未能解决你的问题,请参考以下文章

python itertools groupby 返回元组

[PY3]——根据某个特定的字段来分组迭代访问一个字段或序列?/ itertools.groupby( )函数

为啥 itertools.groupby() 不起作用? [复制]

显然是用 itertools.groupby 生成的空组

python中的itertools.groupby()

itertools.groupby 的反面?