我需要递归地将int添加到列表中,稍后还要添加其他功能。
def insert_in_list(x, tree):
if not tree:
return tree
elif isinstance(tree[0], list):
return inserting(x, tree[0]) + inserting(x, tree[1:])
elif x < tree[0]:
tree.insert(0, x)
return tree
else:
return inserting(x, tree[1:])
我正在使用insert()
。但出于某种原因,我的列表似乎仅限于3个值。例如
>>> insert_in_list(2, [1,5,10])
[2,5,10]
1
发生了什么?
答案 0 :(得分:1)
因为您的上一个案例会丢弃第一个值。您将首先拨打insert_in_list(x, tree)
并在案例4中结束,它将调用insert_in_list(x, [5, 10])
。然后,这将结束于案例3并在第一个位置插入x
,然后返回新列表[2, 5, 10]
。
处理指数可能更容易:
def insert_in_list(x, tree, index=0):
if not tree:
return tree
elif x < tree[index]:
tree.insert(index, x)
return tree
else:
return insert_in_list(x, tree, index+1)
我刚刚省略了第二个案例,因为它与你的问题无关:
>>> insert_in_list(2, [1,5,10])
[1, 2, 5, 10]
请注意,如果您的tree
已排序,您还可以进行二分而不是递归,以找到应插入值的位置。例如,使用递归二分法并基于bisect.insort_right
:
def insert_in_list(x, tree, lo=0, hi=None):
if not tree:
return tree
if hi is None:
hi = len(tree)
if lo < hi:
mid = (lo + hi) // 2
if x < tree[mid]:
hi = mid
else:
lo = mid + 1
return insert_in_list(x, tree, lo, hi)
tree.insert(lo, x)
return tree