有人可以解释groupby操作和this SO帖子上使用的lambda函数吗?带有itertools count()和groupby()的lambda函数
key=lambda k, line=count(): next(line) // chunk
import tempfile
from itertools import groupby, count
temp_dir = tempfile.mkdtemp()
def tempfile_split(filename, temp_dir, chunk=4000000):
with open(filename, 'r') as datafile:
# The itertools.groupby() function takes a sequence and a key function,
# and returns an iterator that generates pairs.
# Each pair contains the result of key_function(each item) and
# another iterator containing all the items that shared that key result.
groups = groupby(datafile, key=lambda k, line=count(): next(line) // chunk)
for k, group in groups:
print(key, list(group))
output_name = os.path.normpath(os.path.join(temp_dir + os.sep, "tempfile_%s.tmp" % k))
for line in group:
with open(output_name, 'a') as outfile:
outfile.write(line)
编辑:我花了一段时间来回绕与GROUPBY使用lambda函数我的头。我不认为我很了解他们中的任何一个。
Martijn解释得很好,但我有一个后续问题。为什么line=count()
每次都作为lambda函数的参数传递?我试图在变量的外部分配变量line
到count()
一次。
line = count()
groups = groupby(datafile, key=lambda k, line: next(line) // chunk)
和它导致TypeError: <lambda>() missing 1 required positional argument: 'line'
另外,直接在λ表达式呼吁count()
next
,导致在输入文件中的所有行得到聚集在一起,即由groupby
函数生成的单个密钥。
groups = groupby(datafile, key=lambda k: next(count()) // chunk)
我自己学习Python,所以任何帮助或指向参考材料/ PyCon会谈的指针都非常感谢。任何真的!
谢谢。感谢你的帮助! – theguyoverthere