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

时间:2013-02-22 08:34:06

标签: python list split integer indices

我有以下问题。只要原始输入列表的两个元素之间的步长不是1,我就有了一个整数列表,我想把它拆分成一个列表。 例如:input = [0,1,3,5,6,7],output = [[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

非常感谢!

4 个答案:

答案 0 :(得分: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]]

答案 1 :(得分:2)

def _get_parts(i, step=1):
    o = []
    for x in i:
        if o and o[-1] and x - step == o[-1][-1]:
            o[-1].append(x)
        else:
            o.append([x])
    return o

_get_parts([0, 1, 3, 5, 6, 7], step=1)
# [[0, 1], [3], [5, 6, 7]])

答案 2 :(得分:0)

这是一个使用for循环的解决方案。

def splitbystep(alist):
  newlist = [[alist[0]]]
  for i in range(1,len(alist)):
    if alist[i] - alist[i-1] == 1:
      newlist[-1].append(alist[i])
    else:
      newlist.append([alist[i]])
  return newlist

答案 3 :(得分:0)

我就是这样做的:

inp = [0, 1, 3, 5, 6, 7]
base = []

for item in inp:
    if not base or item - base[-1][-1] != 1: # If base is empty (first item) or diff isn't 1
        base.append([item])                  # Append a new list containing just one item
    else:
        base[-1].append(item)                # Otherwise, add current item to the last stored list in base
print base                                   # => [[0, 1], [3], [5, 6, 7]]