英文:
Generate a while loop
问题
我正在尝试为我的代码创建一个while循环。我的想法是不要使用太多的“for”循环来将其放入一个函数中。
int_list = [[[1]],2,[[[[3]]]]]
for i in int_list:
if type(i) != list:
list_of_lists.append(i)
else:
for a in i:
if type(a) != list:
list_of_lists.append(a)
else:
for j in a:
if type(j) != list:
list_of_lists.append(j)
else:
for h in j:
if type(h) != list:
list_of_lists.append(h)
else:
for r in h:
if type(r) != list:
list_of_lists.append(r)
期望的输出
list_of_lists = [1,2,3]
英文:
I'm trying to create a while loop for my code. The idea is not to use so many "for" loops to put it into a function
int_list = [[[1]],2,[[[[3]]]]]
for i in int_list:
if type(i) != list:
list_of_lists.append(i)
else:
for a in i:
if type(a) != list:
list_of_lists.append(a)
else:
for j in a:
if type(j) != list:
list_of_lists.append(j)
else:
for h in j:
if type(h) != list:
list_of_lists.append(h)
else:
for r in h:
if type(r) != list:
list_of_lists.append(r)
Expected Output
list_of_lists = [1,2,3]
答案1
得分: 0
一种减少for循环的方法是创建一个递归函数。
该函数通过将sublist(i)
作为参数传递给helper()
,递归调用自身。然后使用extend()
方法将生成的列表扩展到结果列表中。
如果它的instance
不是list
,则执行else部分。将值附加到lis
中。
代码:
def helper(lis):
res = []
for i in lis:
if isinstance(i, list):
res.extend(helper(i))
else:
res.append(i)
return res
int_list = [[[1]], 2, [[[[3]]]]
list_of_lists = helper(int_list)
print(list_of_lists)
输出:
[1, 2, 3]
英文:
One way to reduce for loop is to create a recursive function.
The function recursively calls itself on that sublist(i)
by passing it as an argument to helper()
. The resulting list is then extended to the result list using the extend()
method.
If it's instance
is not a list
. it runs else part. appending value into the lis
Code:
def helper(lis):
res=[]
for i in lis:
if isinstance(i, list):
res.extend(helper(i))
else:
res.append(i)
return res
int_list=[[[1]], 2, [[[[3]]]]]
list_of_lists=helper(int_list)
print(list_of_lists)
Output:
[1,2,3]
答案2
得分: 0
递归函数是展平这样的列表的理想方式。如果您真的想在单个 while 循环中执行此操作,那么可以通过创建一个堆栈来帮助您跟踪每个子列表中的位置。
这在您定义和调用递归函数时会自动发生;每次调用函数都会将函数的所有本地变量放入一个“堆栈”中,就像下面的代码在发现新的子列表时每次都将当前列表和索引放入名为 stack
的列表中一样。
int_list = [[[1]],2,[[[[3]]]]
flat_list = []
stack = []
i = 0
while True:
if i >= len(int_list):
# 我们已经到达这个子列表的末尾,
# 因此返回堆栈以继续之前的位置。
if not stack:
break # 全部完成!
int_list, i = stack.pop()
elif isinstance(int_list[i], list):
# 跟踪当前列表和要查看的下一个项目,
# 然后开始查看这个子列表。
stack.append((int_list, i+1))
int_list, i = int_list[i], 0
else:
# 我们找到了一个标量项!将其添加到平坦列表中。
flat_list.append(int_list[i])
i += 1
assert flat_list == [1, 2, 3]
英文:
A recursive function is the ideal way to flatten a list like this. If you really want to do it in a single while loop, though, it is possible, by creating a stack to help you keep track of where you are in each sublist.
This happens automatically for you when you define and call a recursive function; every call to the function puts all the function's local variables onto a "stack", just like the code below puts the current list and index onto a list called stack
every time a new sublist is discovered.
int_list = [[[1]],2,[[[[3]]]]]
flat_list = []
stack = []
i = 0
while True:
if i >= len(int_list):
# We're at the end of this sublist,
# so go back to the stack to pick up where we left off.
if not stack:
break # all done!
int_list, i = stack.pop()
elif isinstance(int_list[i], list):
# Keep track of the current list and the next item
# for us to look at, and then start looking at this sublist.
stack.append((int_list, i+1))
int_list, i = int_list[i], 0
else:
# We found a scalar item! Add it to the flat list.
flat_list.append(int_list[i])
i += 1
assert flat_list == [1, 2, 3]
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论