当前位置:  开发笔记 > 编程语言 > 正文

如何让这个Python递归函数返回一个平面列表?

如何解决《如何让这个Python递归函数返回一个平面列表?》经验,为你挑选了4个好方法。

看看这个简单的功能

def prime_factors(n):
    for i in range(2,n):
      if n % i == 0:
        return i, prime_factors(n / i)
    return n

这是结果 prime_factors(120)

(2, (2, (2, (3, 5))))

我希望它返回一个扁平元组或列表,而不是嵌套元组.

(2, 2, 2, 3, 5)

有一个简单的方法吗?



1> Ferdinand Be..:
def prime_factors(n):
  for i in range(2,n):
    if n % i == 0:
      return [i] + prime_factors(n / i)
  return [n]


考虑到原始算法,我不认为性能在这里至关重要:-)
您可以将列表作为参数传递并附加到其中,而不是为每个返回值创建新列表.如果列表变大,这可以节省一些空间和时间.

2> jfs..:
def prime_factors(n):
    for i in range(2,n):
        if n % i == 0:
           yield i
           for p in prime_factors(n / i):
               yield p
           return
    yield n

例:

>>> tuple(prime_factors(100))
(2, 2, 5, 5)



3> Timbo..:

不改变原始功能,来自Python技巧:

def flatten(x):
    """flatten(sequence) -> list

    Returns a single, flat list which contains all elements retrieved
    from the sequence and all recursively contained sub-sequences
    (iterables).

    Examples:
    >>> [1, 2, [3,4], (5,6)]
    [1, 2, [3, 4], (5, 6)]
    >>> flatten([[[1,2,3], (42,None)], [4,5], [6], 7, MyVector(8,9,10)])
    [1, 2, 3, 42, None, 4, 5, 6, 7, 8, 9, 10]"""

    result = []
    for el in x:
        #if isinstance(el, (list, tuple)):
        if hasattr(el, "__iter__") and not isinstance(el, basestring):
            result.extend(flatten(el))
        else:
            result.append(el)
    return result



4> Patrick McEl..:

liw.fi在评论中建议:

您可以将列表作为参数传递并追加到该列表中,而不是为每个返回值创建一个新列表。如果列表变大,则可以节省一些空间和时间。

这是liw.fi建议的实现。

def prime_factors(n, factors=None):
    if factors is None:
        factors = []
    for i in range(2,n):
        if n % i == 0:
            factors.append(i)
            return prime_factors(n / i, factors)
    factors.append(n)
    return factors

推荐阅读
保佑欣疼你的芯疼
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有