2

可能重复:
在 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
4

3 回答 3

3

这似乎工作正常:

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),其中包含另一个列表(任意长度)。在这种情况下,您只是退回了它。

于 2012-10-19T15:03:47.360 回答
1

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

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

如果您想要一个完整的解决方案,Flattening a shallow list in Python and Comprehension for flattening a sequence? 是看的好地方。

于 2012-10-19T15:01:29.370 回答
0

这将适用于多达 3 个级别的深度,如果深度是任意的,我认为您将无法使用列表理解。

[grandchild for parent in l for child in parent for grandchild in child]
于 2012-10-19T15:03:02.913 回答