我有一个已排序的元组(name, path, ref)
列表,我正在使用itertools.groupby
按ref
对它们进行分组。
我正在尝试为每组的第一项做些不同的事情。
代码如下:
from itertools import groupby
from operator import itemgetter
docs = [('foo', '.', 'ref2'), ('bar', '.', 'ref2'), ('baz', '.', 'ref1')]
docs = sorted(docs, key=lambda x: (x[2], x[0]))
for k, g in groupby(documents, itemgetter(2)):
grouped_docs = list(g)
print(grouped_docs[0][0], 'came first.')
for doc in grouped_docs[1:]:
print(doc[0], 'came after')
这有效但我必须将g
转换为列表然后将其切片。
有没有办法获取g
的第一项,然后在不使用列表的情况下迭代生成器的其余部分?
类似的东西:
for k, g in groupby(docs, itemgetter(2)):
first_item = <*magic*>(g)
print(first_item[0], 'came first.')
for doc in g:
print(doc[0], 'came after')
答案 0 :(得分:1)
因为它只是一个迭代器,所以使用next
来获取下一个值,然后消耗第一个项目(因此它不会出现在for循环中。)
for k, g in groupby(documents, itemgetter(2)):
first_item = next(g)
print(first_item[0], 'came first.')
for doc in g:
print(doc[0], 'came after')
答案 1 :(得分:1)
g是一个迭代器,默认情况下python迭代器有一个.__next__()
方法。这可以使用帮助(g)查看。
无论如何,代码将如下:
for k, g in groupby(documents, itemgetter(2)):
first_item = next(g) ### = g.__next__() will do the same job.
print(first_item[0], 'came first.')
for doc in g:
print(doc[0], 'came after')
迭代器/生成器的一般指南:http://anandology.com/python-practice-book/iterators.html