itertools.groupby 返回错误结果(这与排序无关)
itertools.groupby returning wrong result (this is not about sorting)
我想将字符串分解成单词,但保留单词开始处的索引。例如,我想将 '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')], [], []]
,我不知道为什么。也许我在这里遗漏了一些非常简单的东西,但我就是看不到它。
更正代码:
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
中的子迭代器生效
我想将字符串分解成单词,但保留单词开始处的索引。例如,我想将 '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')], [], []]
,我不知道为什么。也许我在这里遗漏了一些非常简单的东西,但我就是看不到它。
更正代码:
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