Mas*_*ler 2 python python-itertools
我最近不得不调试一些类似这样的代码:
for key, group in itertools.groupby(csvGrid, lambda x: x[0]):
value1 = sum(row[1] for row in group)
value2 = sum(row[2] for row in group)
results.append([key, value1, value2])
Run Code Online (Sandbox Code Playgroud)
在每个结果集中,value2作为0. 当我查看它时,我发现代码第一次迭代时group,它消耗了它,因此第二次迭代时有零个元素。
直觉上,我希望group是一个可以无限次迭代的列表,但它的行为就像一个只能迭代一次的迭代器。这种情况有什么好的理由吗?
itertools是一个迭代器库,就像库中的其他所有东西一样,itertools.groupby组是迭代器。没有一个函数itertools返回一个序列。
groupby 组是迭代器的原因与 itertools 中的其他所有内容都是迭代器的原因相同:
此外,组是迭代器,因为您可能只需要键,在这种情况下实现组将是一种浪费。
itertools.groupby不打算与任何 LINQ 构造、SQL 子句或其他名称为“group by”的内容完全匹配。uniq与 LINQ 或 SQL 相比,它的分组行为更接近于 Unix命令的扩展,尽管它创建组的事实意味着它不是uniq两者的完全匹配。
作为一个你可以用我itertools.groupby提到的其他工具不能做的事情的例子,这是一个游程编码器:
def runlengthencode(iterable):
for key, group in groupby(iterable):
yield (key, sum(1 for val in group))
Run Code Online (Sandbox Code Playgroud)