Python:基于它们之间的步骤拆分整数列表

mat*_*tam 5 python integer split list indices

我有以下问题.当原始输入列表的两个元素之间的步长不是1时,有一个整数列表,我想将它拆分成列表列表.例如:input = [0,1,3,5,6,7 ],输出= [[0,1],[3],[5,6,7]]

我写了下面这个函数,但它很糟糕,我想知道你们中的任何人是否会帮我找到更好的解决方案.我试图使用itertools,但无法解决它.

这是我的解决方案:

def _get_parts(list_of_indices):
    lv = list_of_indices
    tuples = zip(lv[:-1], lv[1:])
    split_values = []
    for i in tuples:
        if i[1] - i[0] != 1:
            split_values.append(i[1])
    string = '/'.join([str(i) for i in lv])
    substrings = []
    for i in split_values:
        part = string.split(str(i))
        substrings.append(part[0])
        string = string.lstrip(part[0])
    substrings.append(string)
    result = []
    for i in substrings:
        i = i.rstrip('/')
        result.append([int(n) for n in i.split('/')])
    return result
Run Code Online (Sandbox Code Playgroud)

非常感谢!

Joh*_*ooy 8

这适用于任何可迭代的

>>> from itertools import groupby, count
>>> inp = [0, 1, 3, 5, 6, 7]
>>> [list(g) for k, g in groupby(inp, key=lambda i,j=count(): i-next(j))]
[[0, 1], [3], [5, 6, 7]]
Run Code Online (Sandbox Code Playgroud)

  • 好的解决方案 我认为描述会很有用:`j = count()`创建一个计数器.对`next(j)`的每次调用都将逐步返回int.不明显的python行为:函数参数的默认值在函数创建时创建一次.因此,`j`将仅用count()初始化一次,在下一次调用`key`时,arg`j`将具有先前创建的实例.`groupby`将附加`c`来自`inp`的所有项,它们具有相同的键值.如果键值已更改 - 将创建新g.对于来自inp的项目:item = 0,key = 0-0 = 0; item = 1,key = 1-1 = 0; item = 3,key = 3-2 = 1; item = 5,key = 5-3 = 2,依此类推. (4认同)