【问题标题】:Split a list into sublists based on a set of indexes in Python根据 Python 中的一组索引将列表拆分为子列表
【发布时间】:2020-05-02 01:39:08
【问题描述】:

我有一个类似下面的列表

['a','b','c','d','e','f','g','h','i','j']

我想用索引列表分隔

[1,4]

在这种情况下,它将是

[['a'],['b','c'],['d','e','f','g','h','i','j']]

作为

[:1] =['a']

[1:4] = ['b','c']

[4:] = ['d','e','f','g','h','i','j']

情况2:如果索引列表是

[0,6]

会的

[[],['a','b','c','d','e'],['f','g','h','i','j']]

作为

[:0] = []

[0:6] = ['a','b','c','d','e']

[6:] = ['f','g','h','i','j']

情况 3,如果索引是

[2,5,7]

这将是 [['a','b'],['c','d','e'],['h','i','j']] 作为

[:2] =['a','b']
[2:5] = ['c','d','e']
[5:7] = ['f','g']
[7:] = ['h','i','j']

【问题讨论】:

  • 如果您的问题是如何获取这些子列表:为什么不使用简单的循环?
  • 这听起来只有 99% 像家庭作业。你想用这个实现什么?或者换句话说,作业要你做什么?您已经根据一组索引拆分列表。
  • 您显示的切片不一致。 [0:6] = ['a','b','c','d','e'] 应该是 ['a','b','c','d','e','f'][1:4] = ['b','c'] 应该是 ['b','c','d']

标签: python


【解决方案1】:

类似的东西:

mylist = ['a','b','c','d','e','f','g','h','i','j']
myindex = [1,4]

[mylist[s:e] for s, e in zip([0]+myindex, myindex+[None])]

输出

[['a'], ['b', 'c', 'd'], ['e', 'f', 'g', 'h', 'i', 'j']]

【讨论】:

    【解决方案2】:
    a = [1,2,3,4,5,6,7,8,9,10]
    
    newlist = []
    
    divide = [2,5,7]
    divide = [0]+divide+[len(a)]
    for i in range(1,len(divide)):
      newlist.append(a[divide[i-1]:divide[i]])
    
    print(newlist)
    

    输出:

    [[1, 2], [3, 4, 5], [6, 7], [8,9,10]]
    

    【讨论】:

      【解决方案3】:

      此解决方案使用 numpy:

      import numpy as np
      
      def do_split(lst, slices):
          return [sl.tolist()for sl in np.split(lst, slices)]
      
      splits = do_split(a, [2,5,7])
      
      Out[49]:
      [['a', 'b'], ['c', 'd', 'e'], ['f', 'g'], ['h', 'i', 'j']]
      
      

      【讨论】:

      • 通过避免复制,这将比我的方法更快,+1!
      【解决方案4】:

      我写了这个函数来做你要求的事情

      def splitter(_list, *args):
          args_list = [0]
          args_list += args
          args_list.append(len(_list))
          new_list = []
          for i, arg in enumerate(args_list):
              try:
                  new_list.append(_list[arg:args_list[i+1]])
      
              except IndexError:
                  continue
          return new_list
      
      

      函数可以这样使用:

      mylist = ['1', '2', '3', '4', '5', '6']
      splitter(mylist, 2, 4)
      

      返回:

      [['1', '2'], ['3', '4'], ['5', '6']]
      

      【讨论】:

        猜你喜欢
        • 2013-09-05
        • 2018-09-24
        • 2015-12-13
        • 2020-01-14
        • 1970-01-01
        • 2015-05-13
        • 2018-10-24
        • 2017-01-19
        相关资源
        最近更新 更多