python - 将 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 循环转换为列表理解,任何人都可以帮助我。
解决方案
问题是对于所有数字 (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 1
to20
和 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
推荐阅读
- javascript - 如何创建一个功能性的 JavaScript 搜索栏
- erc20 - Erc20 token transferFrom
- python - 如何在路由/端点之外使用flask-MySQLdb的连接或游标?
- spring - Camunda:通过多个流程实例共享变量的最佳实践
- javascript - 我发现在 discord.js 机器人中包含图像的代码有什么问题?
- z3 - 如何优化 smt2 文件?
- angular - 打字稿无法读取'get'未定义继承问题的属性
- javascript - 我应该使用什么网址来创建唯一页面?
- javascript - 在 React useState 挂钩中删除数组的第一个元素?
- python - 无法从 pyinstaller exe 中的子进程调用 python