Hello Ladies and Gents,
我有这段代码可以在列表中找到连续的数字:
from itertools import groupby
from operator import itemgetter
a = [1,2,3,5,55,56]
def consc(b):
for k, g in groupby(enumerate(b), lambda (i,x):i-x):
print map(itemgetter(1), g)
consc(a)
输出:
[1, 2, 3]
[5]
[55, 56]
但是,我希望能够寻找其他增量(1到10),例如,差异为2将从同一列表中产生以下输出:
[1]
[2]
[3,5]
[55]
[56]
谢谢!
答案 0 :(得分:2)
这实际上是一个非常简单的修改:
from itertools import groupby, count
from operator import itemgetter
a = [1,2,3,5,55,56]
def consc(b, step):
for k, g in groupby(zip(count(step=step), b), lambda (i, x): i-x):
print map(itemgetter(1), g)
consc(a, 2)
给出了:
[1]
[2]
[3, 5]
[55]
[56]
我们使用enumerate()
和zip()
而不是count()
,而是使用所需值的步骤,这会得到想要的结果。
稍微清理一下:
from itertools import groupby, count
from operator import itemgetter
def _sub(item):
a, b = item
return a - b
def consecutive(iterable, step):
for _, g in groupby(zip(count(step=step), iterable), _sub):
yield map(itemgetter(1), g)
a = [1, 2, 3, 5, 55, 56]
print(list(consecutive(a, 2)))
在这里使用生成器是有意义的,并使用更具描述性的名称。使用实际函数可以避免每次使用函数时重新声明它,就像使用lambda
一样。这也适用于Python 3.x,避免使用已从语言中删除的参数解包。