Python:在列表匹配条件的点处将列表拆分为嵌套列表

时间:2013-06-12 11:35:26

标签: python list split

我想在一个项目超过一定长度的点上拆分列表。

我的数据的简化版本是:

li = [1,2,3,4000,5,6,7,8,9000,10,11,12,1300]

我想要实现的结果如下

new_li = [[1,2,3],[4000,5,6,7,8],[9000,10,11,12,1300]]

我是编程新手,对这个问题的解决方法有点困惑。

我正在考虑循环并在每次项目长度大于2时创建索引但是我将如何重新创建嵌套列表。

3 个答案:

答案 0 :(得分:9)

这样的事情:

li = [1,2,3,4000,5,6,7,8,9000,10,11,12,1300]
r = [[]]  # start with a list containing an empty sub-list
for i in li:
  if i >= 2000:
    # start a new sub-list when we see a big value
    r.append([i])
  else: 
    # append to the last sub-list of r
    r[-1].append(i)

答案 1 :(得分:3)

from itertools import groupby

li = [1,2,3,4000,5,6,7,8,9000,10,11,12,1300]

class GroupbyHelper(object):

    def __init__(self, val):
        self.val = val
        self.i = 0

    def __call__(self, val):
        self.i += (val > self.val)
        return self.i


>>> [list(g) for k, g in groupby(li, key=GroupbyHelper(2000))]
[[1, 2, 3], [4000, 5, 6, 7, 8], [9000, 10, 11, 12, 1300]]

答案 2 :(得分:1)

使用切片而不是重新附加每个项目可能更有效:

li = [1,2,3,4000,5,6,7,8,9000,10,11,12,1300]
res = []
indices = (i for i, v in enumerate(li) if v > 2000)
i = 0
for i2 in indices:
    res.append(li[i:i2])
    i = i2
res.append(li[i:])

修改

更短的版本:

li = [1,2,3,4000,5,6,7,8,9000,10,11,12,1300]
indices = [i for i, v in enumerate(li) if v > 2000]
res = [li[i:j] for i, j in zip([0]+indices, indices+[None])]