【问题标题】:Python - Best way to recursively create a list?Python - 递归创建列表的最佳方法?
【发布时间】:2018-04-25 15:53:30
【问题描述】:
# class TreeNode(object):
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = None      

sum = 25
  ans = []
  def recurse(s, traverse, ls):
                #append tuple
                ls = ls + (traverse.val,)
                if (traverse.right):
                    recurse(s, traverse.right, ls)
                if (traverse.left):
                    recurse(s, traverse.left, ls)
                if (s==sum): 
                    #convert touple and add to answer
                    tmp = list(ls)
                    ans.append(tmp)

  a = tuple()
  recurse(0, root, a)

在此代码中,我将列表动态附加到列表 (ans)。在此示例中,我使用递归并使用元组来构建每个子列表,因为它是不可变的。然后,我将其转换为列表并将其附加到我的答案中。如果我只使用列表,我将无法在每次调用我的函数时传递副本。

以这种方式使用元组有任何性能缺点吗?有没有更好的方法来递归创建类似问题的列表?

此外,这种方法实际上不适用于 2d 列表...制作 2D 不可变列表的最佳方法是什么?

【问题讨论】:

  • 你应该使用if traverse.right is not None:而不是if (traverse.right):
  • 这是有原因的吗?
  • 如果您调用if object,其中object 是某个类的某个实例,它将调用其__bool____nonzero__ 方法(如果存在)(取决于python 版本)。因此,如果 if var 正在检查某些对象的返回值 __bool__/__nonzero__ 方法,如果 var 为 None 是不明确的。 if object is None 但是,只有明确检查变量的身份是否为 None

标签: python list tuples


【解决方案1】:

我猜sum 是您想要执行的最大遍历次数。

以下方法可以解决问题:

def traverse(root, limit=None, count=0):
    if not root or count == limit:
        return []
    traversal = [root.val]
    traversal += traverse(root.right, limit, count + len(traversal))
    traversal += traverse(root.left, limit, count + len(traversal))
    return traversal

那么,你可以这样称呼它:

root = TreeNode(20)
root.right = TreeNode(40)
root.right.right = TreeNode(50)
root.right.left = TreeNode(30)
root.left = TreeNode(10)
root.left.left = TreeNode(5)

traverse(root)          // [20, 40, 50, 30, 10, 5]
traverse(root, limit=1) // [20]
traverse(root, limit=4) // [20, 40, 50, 30]

或者,如果您可以在__init__ 提供rightleft 节点,您可以采用很酷的函数式方法:

print(
    traverse(
        Node(20,
            right=Node(40,
                right=Node(50),
                left=Node(30)),
            left=Node(10,
                left=Node(5))),
        limit=3))
 # > [20, 40, 50]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-17
    • 2011-04-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多