python - 如何创建具有可变数量“for”循环的函数,每个循环都有不同的索引?
问题描述
问题:
考虑一个d维简单立方晶格。
如果晶格的宽度为L,则晶格点数为L d。我想为一般的d和L创建一个包含所有格点位置的列表。
例如,当L = 2且d = 2时,这将是 [(0, 0), (1, 0), (0, 1), (1, 1)]。
我的尝试:
虽然我可以为一般L做到这一点,但我无法概括维度d。
下面是我使用三个循环对d = 3的解决方案。for
def Positions(L):
PositionList = []
for i in range(L):
for j in range(L):
for k in range(L):
PositionList.append([k, j, i])
return PositionList
很容易看出我将如何更改它以增加或减少维度d,因为我可以简单地添加或删除循环,但显然为大dfor
写出来非常乏味。
我考虑过使用递归for
循环,所以我只会for
对任何d使用一个循环,但我不知道如何在保留索引的同时保留我需要写出位置的索引。
综上所述:
是否可以有可变数量的for
循环,每个循环都有一个不同的索引来解决这个问题?
或者有没有更好的解决方案而不使用for
循环?
解决方案
递归确实是要走的路
这个想法是:
如果您假设您的函数适用于 d-1 维度,那么您可以获取该结果并将i
(循环变量)的值附加到每个结果中,并对 的每个值重复执行此操作i
。
基本情况是当 d=0 时,在这种情况下,您只有一个空结果。
这是如何编码的:
def Positions(L, d):
if d == 0: # base case
return [[]]
return [
[i] + res # prepend i to the results coming from recursion
for i in range(L)
for res in Positions(L, d-1)
]
如果您不熟悉最终语句中使用的列表理解语法,那么在没有该语法的情况下您将如何做到这一点:
def Positions(L, d):
if d == 0: # base case
return [[]]
positions = []
for i in range(L):
for res in Positions(L, d-1):
positions.append([i] + res)
return positions
推荐阅读
- sql - SQL选择彼此“接近”的日期时间值
- sql - Oracle SQL:尝试查询数据时出现重复行
- swift5 - SWINject Graphidentifiers 的预期生命周期是什么
- python - FOR IN 带字符串。包含.sum()
- sql - 如何从 20 列中获取每行的 5 个最高值
- javascript - 为什么我得到这个返回值“jQuery.fn.init [input.search-city, prevObject: jQuery.fn.init(1)]”
- jenkins - 如何根据一些shell脚本在jenkins中生成html报告,有人可以帮助我完成整个过程
- r - 如何将数据框行合并为“其他”
- java - 休眠本机查询在具有多对一关系的循环中插入记录
- azure-devops - 在 Azure DevOps 中,如果单元测试失败,如何防止构建失败