在lis中存储结果列表

2024-06-16 08:45:41 发布

您现在位置:Python中文网/ 问答频道 /正文

我的代码获取一个数字列表,然后找出它的除数。现在,假设我有一个列表[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的第二个索引中

但是,我无法做到这一点,这是我的尝试,也是一个可视化工具,帮助理解代码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()函数。在


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

与其编写函数来查找整数列表中所有数字的因子,不如先编写一个函数来查找一个数的因子:

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)

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

^{pr2}$

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

[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运算符。它本质上相当于将两个数除以,然后调用商的^{}。我们需要这样做是因为n/x将使用“真除法”,正如您所说,它返回一个浮点。因为我们在寻找整数因子,所以只有强制数字为整数才有意义。在

如果您真的愿意,可以用您在问题中使用的算法替换我的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个字符的一行字来获胜:)。虽然这个解决方案很短,但我相信我的第一个解决方案更好,因为它更具可读性。记住,短并不总是更好!在

如果这是你想要的:

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

或者如果你想要简短的版本:

^{pr2}$

输出:

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

相关问题 更多 >