我想在一个项目超过一定长度的点上拆分列表。
我的数据的简化版本是:
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时创建索引但是我将如何重新创建嵌套列表。
答案 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])]