【问题标题】:Python Split list into sublists based on the first element in the sublistsPython根据子列表中的第一个元素将列表拆分为子列表
【发布时间】:2017-12-17 11:25:14
【问题描述】:

我想拆分一个看起来像这样的列表:

list = [5, a, b, c, d, e, 2, a, b, 4, a ,b ,c ,d , ...]

进入这个:

list  = [ [5, a, b, c, d, e], [2, a, b] , [4, a ,b ,c ,d] ...]

第一个元素/数字是可变的,因此没有将其分成偶数块的模式。 块的大小或长度应基于块的第一个元素。 此外,字母只是占位符,使示例更具可读性,实际上字母是浮点数和数字。

所以大名单看起来像这样:

list = [5, 7, 3.2, 3.1, 4.6, 3, 2, 5.1, 7.1, 4, 5.12 ,3.4 ,4.8 ,12.1 , ...]

【问题讨论】:

  • 由于您还没有尝试过,这里有一个熊猫解决方案。 x = pd.Series(lst); result = x.groupby(x.astype(str).str.isdigit().cumsum()).apply(list).tolist()祝你好运!
  • 我不同意重复的目标。那里的答案在这里并不直接适用。

标签: python list sublist


【解决方案1】:

简单的方法,读取每个块长度 n 并包含下 n 个值:

it = iter(l)
[[n, *islice(it, n)] for n in it]

Python 2 版本:

it = iter(l)
[[n] + list(islice(it, n)) for n in it]

或者没有islice:

it = iter(l)
[[n] + [next(it) for _ in range(n)] for n in it]

演示:

>>> from itertools import islice
>>> l = [5, 'a', 'b', 'c', 'd', 'e', 2, 'f', 'g', 4, 'h' ,'i' ,'j' ,'k']
>>> it = iter(l)
>>> [[n, *islice(it, n)] for n in it]
[[5, 'a', 'b', 'c', 'd', 'e'], [2, 'f', 'g'], [4, 'h', 'i', 'j', 'k']]

【讨论】:

    【解决方案2】:

    你可以试试这个:

    l = [5, 'a', 'b', 'c', 'd', 'e', 2, 'a', 'b', 4, 'a' ,'b' ,'c' ,'d']
    
    pos = [(index, i) for index, i in enumerate(l) if type(i)==int]
    l = [l[p[0]:p[0]+p[1]+1] for p in pos]
    print(l)
    

    输出:

    [[5, 'a', 'b', 'c', 'd', 'e'], [2, 'a', 'b'], [4, 'a', 'b', 'c', 'd']]
    

    【讨论】:

    • 最后一个列表包含最后一项。但是,请不要喂巨魔......
    • 如果“占位符”中有整数则不起作用。就像在他们的明确示例中一样。
    【解决方案3】:

    也可以试试这样简单的:

    l = [5, 'a', 'b', 'c', 'd', 'e', 2, 'f', 'g', 4, 'h' ,'i' ,'j' ,'k']
    
    numbers = [i for i, e in enumerate(l) if isinstance(e, int)]
    
    result = [l[s:e] for s, e in zip(numbers[:-1], numbers[1:])] + [l[numbers[-1]:]]
    
    print(result)
    # [[5, 'a', 'b', 'c', 'd', 'e'], [2, 'f', 'g'], [4, 'h', 'i', 'j', 'k']]
    

    【讨论】:

      猜你喜欢
      • 2015-12-13
      • 2020-08-21
      • 2020-11-02
      • 2018-12-22
      • 2021-08-20
      • 2022-01-20
      • 1970-01-01
      • 2015-05-19
      • 1970-01-01
      相关资源
      最近更新 更多