我正在学习递归,但我无法弄清楚为什么这不起作用。
它应该做什么:
>>> copy(1)
[1, 1]
>>> copy([1, 2])
[1, 1, 2, 2]
>>> copy([1, [2, 3]])
[1, 1, [2, 2, 3, 3]]
所以基本上代码应该只复制每个整数。注意:列表中的位置和格式(如果它是嵌套列表)不会更改,所有这些代码都会在列表中的每个int旁边插入一个重复的int。
代码:
def copy(nested_list):
new_list = []
#if list is empty
if isinstance(nested_list, list) and len(nested_list) == 0:
return new_list
# if it's only an int
elif isinstance(nested_list, int):
new_list.append(nested_list)
new_list.append(nested_list)
else:
# if list is a list
if isinstance(nested_list, list):
for num in range(len(nested_list)):
if isinstance(nested_list[num], int):
new_list.append(nested_list[num])
new_list.append(nested_list[num])
elif isinstance(nested_list[num], list):
copy(nested_list[num])
else:
pass
return new_list
它适用于大多数示例,除了最后一个示例。
它为最后一个例子提供了什么:
Expected:
[1, 1, [2, 2, 3, 3]]
Got:
[1, 1]
答案 0 :(得分:4)
检查一下!
def copy(nested_list):
new_list = []
#if list is empty
if isinstance(nested_list, list) and len(nested_list) == 0:
return new_list
# if it's only an int
elif isinstance(nested_list, int):
new_list.append(nested_list)
new_list.append(nested_list)
else:
# if list is a list
if isinstance(nested_list, list):
for num in range(len(nested_list)):
if isinstance(nested_list[num], int):
new_list.append(nested_list[num])
new_list.append(nested_list[num])
elif isinstance(nested_list[num], list):
tempList = copy(nested_list[num])
new_list.append(tempList)
else:
pass
return new_list
print(copy([1, [2, 3]]))
答案 1 :(得分:1)
您的copy
函数是递归的,但您完全忽略递归调用copy
的结果:
elif isinstance(nested_list[num], list):
copy(nested_list[num])
^^^^^^^^^^^^^^^^^^^^^^
您可能希望将来自copy
的通话所返回的商品附加到new_list
的末尾:
new_list.append(copy(nested_list[num]))
你也可以稍微简化一下:
def copy(nested_list):
if isinstance(nested_list, int):
return copy([nested_list])
result = []
for elem in nested_list:
if isinstance(elem, int):
result.append(elem)
result.append(elem)
else:
result.append(copy(elem))
return result
答案 2 :(得分:1)
这是另一种实施方式!
def copy(items):
if isinstance(items, int):
return [items, items]
result = []
for element in items:
if isinstance(element, int):
result.extend(copy(element))
else:
result.append(copy(element))
return result
答案 3 :(得分:0)
递归的技巧是解决最基本的情况并调用自身来解决(现在)较小的问题:
def repeat_int(seq_or_int, nested=False):
try:
first, *rest = seq_or_int
except TypeError: # got int
return [seq_or_int] * 2 # repeat int
except ValueError: # empty
result = []
else:
result = repeat_int(first, nested=True) + repeat_int(rest)
return [result] if nested else result # nest in a list if necessary
示例:
>>> repeat_int(1)
[1, 1]
>>> repeat_int([1, 2])
[1, 1, 2, 2]
>>> repeat_int([1, [2, 3]])
[1, 1, [2, 2, 3, 3]]
这里有两个基本情况:
int
) - 返回列表中的重复输入The Python 3 iterable unpacking syntax切断输入集合中的第一项:
first, *rest = seq_or_int
要获得集合其余部分的结果,使用(现在)较小的列表repeat_int(rest)
进行递归调用。
剩下的就是处理第一个与输入相同的项目也可能是一个集合。要保留结构,将传递nested
指示符,如果已设置,则结果列表将包含在另一个列表中。