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.groupby
和 str.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 返回错误的结果(这与排序无关)[重复]的主要内容,如果未能解决你的问题,请参考以下文章
[PY3]——根据某个特定的字段来分组迭代访问一个字段或序列?/ itertools.groupby( )函数