0

我有这段代码可以在列表中找到连续的数字:

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]

谢谢!

4

1 回答 1

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()andcount()与所需值的步长,这给出了想要的结果。

稍微整理了一下:

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。

于 2013-04-21T16:20:18.213 回答