【问题标题】:plain list from list of lists of lists来自列表列表的普通列表
【发布时间】:2021-12-08 18:44:16
【问题描述】:

我有一个这样的列表:

list1=[['milk', 'bread', 'eggs'], ['eggs', ['milk'], 'bread']]

我想变平(预期结果):

list1=[['milk', 'bread', 'eggs'], ['eggs', 'milk', 'bread']]

我正在使用此代码:

flat_list = []
for sublist in list1:
    for item in sublist:
        flat_list.append(item)

但我回来了:

list1=['milk', 'bread', 'eggs', 'eggs', ['milk'], 'bread']

有什么想法吗?

【问题讨论】:

  • 你真的想要list1=[[...]],它是一个单元素列表,它的元素是一个列表,还是你的意思是list1=[...]
  • 这能回答你的问题吗? Flatten an irregular list of lists
  • @Richard 我编辑我的预期结果

标签: python python-3.x list nested-lists


【解决方案1】:

你可以检查你是否点击了一个列表,如果它是一个列表,则扩展它,如果不是附加它。

flat_list = []
for sublist in list1:
    flat_list.append([])
    for x in sublist:
        if isinstance(x, list):
            flat_list[-1].extend(x)
        else:
            flat_list[-1].append(x)

输出:

[['milk', 'bread', 'eggs'], ['eggs', 'milk', 'bread']]

但如果你有类似的东西,这将不起作用:

[['milk', ['bread', ['eggs']]]]

或者你可以使用以下函数(不使用递归,所以会更快):

def flatten_list(list1):
    out = []
    inside = list1
    while inside:
        x = inside.pop(0)
        if isinstance(x, list):
            inside = x + inside
        else:
            out.append(x)
    return out

out = [flatten_list(sublist) for sublist in list1]

flatten_list([['milk', ['bread', ['eggs']]]]) #['milk', 'bread', 'eggs']

【讨论】:

    【解决方案2】:

    这是可以解决您问题的代码

    list1 = [['milk', 'bread', 'eggs'], ['eggs', ['milk'], 'bread']]
    
    flat_list = []
    for i in list1:
        temp_list =[]
        for j in i:
            if type(j) is list:
                temp_list.append(j[0])
            else:
                temp_list.append(j)
        flat_list.append(temp_list)
    

    现在flat_list 输出是

    [['milk', 'bread', 'eggs'], ['eggs', 'milk', 'bread']]
    

    【讨论】:

      【解决方案3】:

      您可以使用递归生成器来展平具有任意嵌套级别的列表(仅受递归深度限制):

      list1=[['milk', 'bread', 'eggs'], ['eggs', ['milk'], 'bread']]
      
      def flatten(iterable):
          from collections.abc import Iterable
          for item in iterable:
              if isinstance(item, Iterable) and not isinstance(item, str):
                  yield from flatten(item)
              else:
                  yield item
                  
      list(flatten(list1))
      

      输出:['milk', 'bread', 'eggs', 'eggs', 'milk', 'bread']

      仅在第一级之后变平:

      out = [list(flatten(l)) for l in list1]
      

      输出:[['milk', 'bread', 'eggs'], ['eggs', 'milk', 'bread']]

      【讨论】:

        【解决方案4】:

        还有一个(这次使用递归生成器函数):

        list1 = [
            ['milk', 'bread', 'eggs'], 
            ['eggs', ['milk'], 'bread'], 
            [[['eggs']], 'milk', [['bread']]]
        ]
        
        def flatten(lst):
            for item in lst:
                if isinstance(item, list):
                    yield from flatten(item)
                else:
                    yield item
        
        list2 = [list(flatten(sublist)) for sublist in list1]
        print(list2)
        

        这将产生

        [['milk', 'bread', 'eggs'], ['eggs', 'milk', 'bread'], ['eggs', 'milk', 'bread']]
        

        【讨论】:

          【解决方案5】:

          递归函数可能是处理这个问题的最简单方法:

          def flatten(L):
              return [f for v in L for f in flatten(v)] if isinstance(L,list) else [L]
          
          
          list1=[['milk', 'bread', 'eggs'], ['eggs', ['milk'], 'bread']]
          print(flatten(list1))
          ['milk', 'bread', 'eggs', 'eggs', 'milk', 'bread']
          

          您还可以使用迭代方法(在本示例中就地执行):

          def flatten(L):
              for i,_ in enumerate(L):
                  while isinstance(L[i],list):
                      L[i:i+1] = L[i]
          
          list1=[['milk', 'bread', 'eggs'], ['eggs', ['milk'], 'bread']]
          flatten(list1)
          print(list1)
          ['milk', 'bread', 'eggs', 'eggs', 'milk', 'bread']
          

          在for循环中使用enumerate()是为了随着列表的增长不断获取额外的索引

          【讨论】:

            猜你喜欢
            • 2021-05-06
            • 2017-05-18
            • 2012-01-07
            • 1970-01-01
            • 1970-01-01
            • 2012-08-31
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多