我有一个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
答案 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 Python和Comprehension for flattening a sequence of sequences?是值得关注的好地方。
答案 2 :(得分:0)
这将深达3级,如果深度是任意的,我认为你不能使用列表理解。
[grandchild for parent in l for child in parent for grandchild in child]