Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python:在项目匹配条件的点将列表拆分为嵌套列表_Python_List_Split - Fatal编程技术网

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

Python:在项目匹配条件的点将列表拆分为嵌套列表,python,list,split,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时循环并创建索引,但我不知道如何重新创建嵌套列表。类似这样的内容: li = [1,2,3,4000,5,6,7,8,9000,10

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

我的数据的简化版本是:

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时循环并创建索引,但我不知道如何重新创建嵌套列表。

类似这样的内容:

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)

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

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])]

您所说的项目长度大于2是什么意思?我认为您遇到的问题是,您的规范完全失败了。当我比较li和new_li时,我看不到这两个列表中出现的算法模式。我很困惑。我猜当一个数字字符串的长度?是否大于2?如果是这样的话,为什么1300不单独出现在一个列表中?请编辑你的问题以澄清你的问题。这可能是一个想法,但它会生成[[1,2,3],[4000,5,6,7,8],[9000,10,11,12],[1300]]我将其更正为2000。但问题是他们到底想在哪里分裂,这就是我要寻找的。非常感谢这似乎有点过于复杂了,特别是对于一个编程新手来说。我考虑过groupby,但我没有考虑使用简单的类来保持状态……有趣的方法。@mgilson我从这里的其他人那里复制了一个类似的问题,我不记得了。编辑:我在@Poole中找到了它,实际上我认为你的方法更简单,但我将把这个放在这里Python列表不能共享结构,因此从一个片段创建它并不比一次只构建一个项目快多少,这会构建其他几个大列表。在li*1000000上,您的代码在我的X201 i7笔记本电脑上需要7.0秒和5.2秒。如果您预期li会很长,并且列表很少,我可以想象,计算索引然后切片可能是值得的。但一般来说,我认为Python中的直接命令式循环代码通常比花哨的函数代码更快、更简单;这对虚拟机来说不是一个自然的适合。
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])]