【问题标题】:How do I convert a flat list to a list of lists based on value of the elements in python3?如何根据 python3 中元素的值将平面列表转换为列表列表?
【发布时间】:2021-10-31 17:10:51
【问题描述】:

我有一个清单 arr=[1,-1,4,-1,4,2]

有没有办法将其转换为[[1],[4],[4,2]]

基本上 -1 表示子列表的结束位置

我试过了

number_of_sublists=arr.count(-1)
lst=[[]]*(number_of_sublists+1)
    
idx=0
for i in arr:
    print(idx)
    if i==-1:
        idx+=1
    else:
        lst[idx].append(i)
print(lst)

但它给了我输出

[[1,4,4,2],[1,4,4,2],[1,4,4,2]]

为什么会这样

【问题讨论】:

  • 转换的依据是什么?

标签: python python-3.x list multidimensional-array


【解决方案1】:

试试这个:

arr=[1,-1,4,-1,4,2]
newarr = [[]]
for i in arr:
    if i != -1:
        newarr[-1].append(i)
    else:
        newarr.append([])
print(newarr)

输出:

[[1], [4], [4, 2]]

【讨论】:

    【解决方案2】:

    你可以使用itertols.groupby:

    from itertools import groupby
    
    arr = [1, -1, 4, -1, 4, 2]
    
    [[*g] for k, g in groupby(arr, key=(-1).__ne__) if k]
    # [[1], [4], [4, 2]]
    

    【讨论】:

      【解决方案3】:

      提供的所有答案都适用于您的任务,但如果您想知道为什么您的原始代码不起作用,那是因为您声明列表的方式lst

      lst=[[]]*(number_of_sublists+1)
      

      通过这样做,您在lst 的每个位置重复相同的列表,也就是说,您已经使number_of_sublists+1 引用了相同的列表。因此,当您修改其中一个时,您实际上是在同时修改所有。

      您可以简单地将声明更改为此,这将解决您的问题:

      lst = [[] for _ in range(number_of_sublists+1)]
      

      【讨论】:

        【解决方案4】:

        您可以使用split_after,如下所示:

        from more_itertools import split_after
        out_arr = list(split_after(arr, lambda x: x == -1))
        [i[:-1] if ((-1) in i) else i for i in out_arr]
        # [[1], [4], [4, 2]]
        

        【讨论】:

          【解决方案5】:

          试试下面的

          arr = [1, -1, 4, -1, 4, 2]
          result = [[]]
          create_new_list = False
          for x in arr:
              if x == -1:
                  create_new_list = True
              else:
                  if create_new_list:
                      result.append([])
                      create_new_list = False
                  result[-1].append(x)
          print(result)
          

          输出

          [[1], [4], [4, 2]]
          

          【讨论】:

            猜你喜欢
            • 2012-04-24
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2012-05-24
            • 2018-07-20
            • 1970-01-01
            • 2020-01-26
            相关资源
            最近更新 更多