获取python列表的所有元素,包括子列表

时间:2012-10-19 14:56:14

标签: python list

  

可能重复:
  Flatten (an irregular) list of lists in Python

我有一个python列表,其元素可以是字母或字母列表。我想编写一个函数来提取所有元素,如下所示

假设

l=['a',['b',['c']] ]

The output need to be ['a','b','c']

我认为递归是正确的方法。 基本情况可以是列表仅包含一个元素。 我试着编码这个..但是输出是

['a', 'b', ['c']]

有人可以告诉我这里出了什么问题吗?

def get_all_elements(mylist):
    if len(mylist)==1:
        return mylist[0]
    else:
        output=[mylist[0]]
        output+=get_all_elements(mylist[1:])
        return output

3 个答案:

答案 0 :(得分:2)

这似乎有效:

def flatten(iterable):
   out = []
   for i in iterable:
      if hasattr(i,'__iter__'):
         out.extend(flatten(i))
      else:
         out.append(i)
   return out

l=['a',['b',['c']] ]   
print flatten(l)

出错的地方是,在您的解决方案中,mylist[0]本身可以是一个包含另一个列表(任意长度)的列表(长度为1)。在那种情况下,你刚刚退回了它。

答案 1 :(得分:1)

当您检查mylist的长度是否为1时,您不会检查其内容是否为列表的情况。这是一个突出你问题的例子。

get_all_elements([1, [2, [3, 4]]])

如果您需要完整的解决方案,Flattening a shallow list in PythonComprehension for flattening a sequence of sequences?是值得关注的好地方。

答案 2 :(得分:0)

这将深达3级,如果深度是任意的,我认为你不能使用列表理解。

[grandchild for parent in l for child in parent for grandchild in child]