在列表中存储结果列表

时间:2016-01-29 21:19:07

标签: python list python-3.x

我的代码会获取一个数字列表并找到它的除数。现在,假设我有一个列表[12,15,20]。现在,当我浏览列表中的每个元素时,我的目标是将所有12,15和20的除数存储在单独的列表中,以便稍后再引用它们

,例如,

4的除数是1, 2, 4

12的除数为1, 2, 3, 4, 6, 12

因此,结果应该看起来像[[1,2,4],[1,2,3,4,6,12]]

现在,在找到4的除数后,将它们附加到列表中。然后将该列表存储在名为M的新列表的第一个索引中。然后,继续查找12的除数,将它们附加到列表并将该列表存储在列表M的第2个索引中

但是,我无法做到这一点,这是我的尝试和可视化工具,以帮助理解代码http://goo.gl/InJxV3中发生的事情:

def fn(N):
    result = []
    G = []
    if type(N) is list:                          #checks input for list type
        for i in N:                          #for elements in input. e.g., 12,15,20
            for j in range(1,i+1):           #j is the numbers that we're going to divide i with
                if(i%j == 0 and i >= j):     #checks if remainder is 0, if it is, then j is a divisor/multiple of i
                    result.append(j)         #appends j to list result
            G.append([result])               # <----- NOT RIGHT.Attempting to create a new list to store result.
return print(G[:])

fn([4,12,15])

很乐意获得一些指导,帮助,建议。另外,我不想使用zip()函数。

4 个答案:

答案 0 :(得分:2)

不是编写函数来查找整数列表中所有数字的因子,而是首先编写一个函数来查找一个数字的因子:

def factor(n):
    factors = set()

    for x in range(1, int(n**0.5) + 1):
        if n % x == 0:
            factors.add(x)
            factors.add(n//x)

    return sorted(factors)

现在您可以找到单个数字的因子,您可以使用map()将其应用于数字列表:

map(factor, [4, 12, 15])

或者,您可以使用列表理解:

[factor(n) for n in [4, 12, 15]]

这两种方法都返回以下内容:

  

[[1,2,4],[1,2,3,4,6,12],[1,3,5,15]]

如果您愿意,可以将其中任何一个变为函数:

def factor_list(arr):
    return map(factor, arr)

factor_list([4, 12, 15])

正如您所看到的,将最初的问题从找到数字列表的因素分解为找到一个数字的因子使得整体问题变得更容易,解决方案更加简单。

编辑1

以下是根据OP的请求解释我使用n//x而不是n/x的原因的原因。

//是Python中的floor division运算符。它基本上相当于将两个数字分开,然后在商上调用math.floor()。我们需要这样做的原因是n/x会使用&#34;真正的除法,&#34;如你所说,返回一个浮点数。由于我们正在寻找积分因子,因此强制数字为整数是有意义的。

如果您真的想要,可以使用您在问题中使用的算法替换我的factor函数,而不会改变程序的行为:

def factor(i):
    result = []
    for j in range(1, i+1):
        if i % j == 0:
            result.append(j)
    return result

或者,更短的等价物:

def factor(i):
    return [j for j in range(1, i+1) if i % j == 0]

然而,我使用的算法更有效率,因为它只需要检查,直到数字的平方根被考虑。

编辑2

我从其他答案中看到你可能正在寻找最短的解决方案:

fn=lambda a:map(lambda i:[j for j in range(1, i+1)if i%j==0],a)

我相信我赢了以上,63个角色的单线:)。虽然这个解决方案很短,但我相信我的第一个解决方案更好,因为它更具可读性。请记住,短期并不总是更好!

答案 1 :(得分:1)

  • 您永远不会创建新列表。 这应该在循环中:result = []
  • return print(G[:])您要么打印要么返回。混合它们没有意义,因为print没有返回任何内容(None)。

答案 2 :(得分:1)

如果那是你想要的:

def fn(N):
    result = []
    if isinstance(N, list):
        for i in N:
            G = []
            for j in range(1,i+1):
                if not i%j and i >= j:
                    G.append(j)
            result.append(G)
    return result

或者如果你想要短版本:

def fn(n):
    return [[j for j in range(1,i+1) if not i % j and i >= j] 
            for i in n if isinstance(n, list)]  

print fn([4, 12, 15])

输出:

[[1, 2, 4], [1, 2, 3, 4, 6, 12], [1, 3, 5, 15]]

答案 3 :(得分:1)

你可以试试这个:

def fn(N):
    result = []
    G = []
    if type(N) is list:                          #checks input for list type
        for i in N:                          #for elements in input. e.g., 12,15,20
            for j in range(1,i+1):           #j is the numbers that we're going to divide i with
                if(i%j == 0 and i >= j):     #checks if remainder is 0, if it is, then j is a divisor/multiple of i
                    result.append(j)         #appends j to list result
            G.append(result)
            result = []
    print(G)
    return G

fn([4,12,15])