在另一个帖子(Python splitting list based on missing numbers in a sequence)中,我找到了这个解决方案:
data = [1, 4,5,6, 10, 15,16,17,18, 22, 25,26,27,28]
for k, g in groupby(enumerate(data), lambda (i,x):i-x):
print map(itemgetter(1), g)
我是Python新手,并尝试将其改编为Python 3.4:
for k, g in groupby(enumerate(data), lambda i,x :i-x):
print('%s' % list(map(itemgetter(1), g)))
我收到此错误:
<lambda>() missing 1 required positional argument: 'x'
我(有限)的理解是groupby语句中的关键函数仍然链接到需要两个参数的lambda函数。是对的吗?更重要的是,有没有办法适应上面的代码?这是一个非常优雅和紧凑的解决方案。
答案 0 :(得分:2)
我的回答有点晚,但我希望这对未来有所帮助。 是的,你是对的。 Python 2翻译的问题 - &gt; Python 3是Python 3中的lambdas不接受元组作为参数的事实。 但是,有一个解决方案,这是通过将预期的序列参数绑定到单个参数然后索引该参数来完成的:
lambda (i,x):i-x
将成为:
lambda x: x[1]-x[0]
因此,在Python 3中运行的代码将是:
from operator import itemgetter
import itertools
# Find runs of consecutive numbers using groupby. The key to the solution
# is differencing with a range so that consecutive numbers all appear in
# same group.
L = [ 1, 4,5,6, 10, 15,16,17,18, 22, 25,26,27,28]
for k, g in itertools.groupby( enumerate(L), lambda x: x[1]-x[0] ) :
print (list(map(itemgetter(1), g)))
将输出:
[1]
[4, 5, 6]
[10]
[15, 16, 17, 18]
[22]
[25, 26, 27, 28]
请在此处查看有关带元组的lambda的更多信息: python3-equivalent-for-auto-tuple-unpacking-in-lambda