首页 > 解决方案 > 如何创建具有可变数量“for”循环的函数,每个循环都有不同的索引?

问题描述

问题:

考虑一个d维简单立方晶格。

如果晶格的宽度为L,则晶格点数为L d我想为一般的dL创建一个包含所有格点位置的列表。

例如,当L = 2d = 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循环?

标签: pythonfor-looprecursionindexingmathematical-lattices

解决方案


递归确实是要走的路

这个想法是:

如果您假设您的函数适用于 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

推荐阅读