首页 > 解决方案 > 将 for 循环转换为列表理解 Python

问题描述

问题是对于所有数字 (1 - 20),任何数字的最高一位数 (1 - 9) 都可以被整除。

我有一个for循环,如下所示:

values = [[] for value in range(1, 11)]

for num in range(1, 21):
    highest = 0
    for div in range(1, 10):
        if(num % div == 0 and div > highest):
            highest = div
    
    values[highest].append(num)

以下 for 循环输出:

[[], [1, 11, 13, 17, 19], [2], [3], [4], [5, 10, 15, 20], [6, 12], [7, 14], [8, 16], [9, 18]]

可以忽略输出中的空列表 []。例如:

[[1, 11, 13, 17, 19], [2], [3], [4], [5, 10, 15, 20], [6, 12], [7, 14], [8, 16], [9, 18]]

我想将以下 for 循环转换为列表理解,任何人都可以帮助我。

标签: pythonpython-3.xlist-comprehension

解决方案


问题是对于所有数字 (1 - 20),任何数字的最高一位数 (1 - 9) 都可以被整除。

我会使用另一种方式实现它list.pop()

nums = list(range(1, 21))
values = []
for d in range(9, 0, -1):
    temp = []
    for i in range(len(nums) - 1, -1, -1):  # iterating in reverse order
        if not nums[i] % d:  # nums[i] % d == 0
            temp.insert(0, nums.pop(i))
    values.insert(0, temp)
print(values)

基本上,我们初始化数字列表 from 1to20和 pop 可被数字整除的值。我list.insert()在这里使用它来使其产生与您的解决方案相同的结果。

评论中我发布了代码,它将以相反的顺序生成列表,这里是:

nums = list(range(1, 21))
values = [[nums.pop(i) for i in range(len(nums) - 1, -1, -1) if not nums[i] % d] for d in range(9, 0, -1)]

您可以添加两个调用(正如我在另一条评论中建议的那样)或使用切片反转它以使其以正确的顺序返回列表:reversed()

nums = list(range(1, 21))
values = [[nums.pop(i) for i in range(len(nums) - 1, -1, -1) if not nums[i] % d][::-1] for d in range(9, 0, -1)][::-1]

更新。我决定添加一些测试结果,这应该有助于了解为什么列表理解并没有使它变得更好。如果你想重现测试,代码在这里

测试结果 (越低越好)

Temple Version: 0.49361748499999997
Tranbi: 1.794325605
JonSG: 5.4978652320000005
JonSG(+ Olvin): 4.834248347000001
Olvin Roght (v1): 0.34827960000000147
Olvin Roght (v2): 0.4133600079999997
Kelly Bundy: 0.19429717999999951
Temple Version(+ Kelly): 0.20479166999999876

推荐阅读