合并python中列表中的相邻数字

时间:2016-08-03 10:03:06

标签: python list python-3.x list-comprehension listiterator

我有一个包含随机数量的整数的列表。 我想迭代这个列表,如果一个数字和连续数字在一个数字步骤之内,我想将它们连接成一个子列表。

例如:

input = [1,2,4,6,7,8,10,11]
output = [[1,2],[4],[6,7,8],[10,11]]

输入列表将始终包含按升序排序的正整数。 我尝试了here中的一些代码。

initerator = iter(inputList)
outputList = [c + next(initerator, "") for c in initerator]

虽然我可以连接列表中的每两个条目,但我似乎无法在列表推导中添加合适的if

Python版本= 3.4

3 个答案:

答案 0 :(得分:0)

很好的方式(找到“拆分”指数然后切片:

input = [1,2,4,6,7,8,10,11]
idx = [0] + [i+1 for i,(x,y) in enumerate(zip(input,input[1:])) if x+1!=y] + [len(input)]
[ input[u:v] for u,v in zip(idx, idx[1:]) ]
#output:
[[1, 2], [4], [6, 7, 8], [10, 11]]

使用enumerate()zip()

答案 1 :(得分:0)

除非你必须有一个单行,你可以使用一个简单的生成器函数,组合元素,直到你遇到一个非连续的元素:

def consec(lst):
    it = iter(lst)
    prev = next(it)
    tmp = [prev]
    for ele in it:
        if prev + 1 != ele:
            yield tmp
            tmp = [ele]
        else:
            tmp.append(ele)
        prev = ele
    yield tmp

输出:

In [2]: lst = [1, 2, 4, 6, 7, 8, 10, 11]

In [3]: list(consec(lst))
Out[3]: [[1, 2], [4], [6, 7, 8], [10, 11]]

答案 2 :(得分:0)

最简单的版本我没有任何导入:

def mergeAdjNum(l):
    r = [[l[0]]]
    for e in l[1:]:
        if r[-1][-1] == e - 1:
            r[-1].append(e)
        else:
            r.append([e])
    return r

比一个衬垫快约33%。

这个处理注释中提到的字符前缀分组:

def groupPrefStr(l):
    pattern = re.compile(r'([a-z]+)([0-9]+)')
    r = [[l[0]]]
    pp, vv = re.match(pattern, l[0]).groups()
    vv = int(vv)
    for e in l[1:]:
        p,v = re.match(pattern, e).groups()
        v = int(v)
        if p == pp and v == vv + 1:
            r[-1].append(e)
        else:
            pp, vv = p, v
            r.append([e])
    return r

这比只有一个数字要慢。知道前缀的确切格式(只有一个char?)可以帮助避免使用re模块并加快速度。