取消列表功能



尝试运行此列表:[1, [2, 3, [4, 5, [6]]], [7, 8], 9]

进入此列表:[1, 2, 3, 4, 5, 6, 7, 8, 9]

到目前为止,这是我的功能:

L = [1, [2, 3, [4, 5, [6]]], [7, 8], 9]
def unnesting(L):
my_list = []
for element in (L):

if type(element) is list:             
my_list.extend(element)

else:
my_list.append(element)

return my_list

除了它给我这个输出:[1,2,3,[4,5,[6],7,8,9]

关于如何取消此列表,有什么解决方案或建议吗?非常感谢。

您需要递归,否则,该函数只适用于嵌套深度为2的情况。重要的认识是,当您的列表再次包含列表时,您将面临相同的问题,即可以再次调用相同的函数。

以下将起作用:

L = [1, [2, 3, [4, 5, [6]]], [7, 8], 9]

def unnest(lst1, lst2=None):
if lst2 is None:
lst2 = []
for x in lst1:
if not isinstance(x, list):
lst2.append(x)
else:
unnest(x, lst2)
return lst2

flattened = unnest(L)
print(flattened)

我想你只是在这里寻找一个简短的递归解决方案,试试这个:

L = [1, [2, 3, [4, 5, [6]]], [7, 8], 9]
def unnesting(my_list):
if type(my_list) == int:
return [my_list]
return sum((unnesting(elem) for elem in my_list), [])

print(unnesting(L))
Out: [1, 2, 3, 4, 5, 6, 7, 8, 9]

如果你对它的工作原理有任何疑问,请在下面留言,我会尽我所能帮助你理解。

你可以试试这个。我刚刚递归地调用了这个函数。

my_list = []
def unnesting(L):
for element in L:
if type(element) is list:
unnesting(element)
else:
my_list.append(element)
return my_list

这是一种有点不同的方法。我不建议这样做。但是python允许我们通过多种方式获得结果。

def unnest(lst):
_ = str(lst)
_ = _.replace('[', '').replace(']', '').replace(',', '').replace(' ', '')
return [int(i) for i in _]
L = [1, [2, 3, [4, 5, [6]]], [7, 8], 9]
unnest(L)

最新更新