为了账号安全,请及时绑定邮箱和手机立即绑定

如何创建一个具有可变数量“for”循环的函数,每个循环都有不同的索引?

如何创建一个具有可变数量“for”循环的函数,每个循环都有不同的索引?

鸿蒙传说 2023-12-09 14:51:36
问题:考虑d维简单立方晶格。如果晶格的宽度为L,则晶格位点的数量为L d。我想创建一个包含一般d和L的晶格位点的所有位置的列表。例如,当L = 2且d = 2时,这将是 [(0, 0), (1, 0), (0, 1), (1, 1)]。我的尝试:虽然我可以对一般L执行此操作,但我无法概括维度d。下面是我使用三个循环解决d = 3for的问题。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循环的解决方案?
查看完整描述

3 回答

?
慕桂英3389331

TA贡献2036条经验 获得超8个赞

递归确实是一条出路


这个想法是:


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


查看完整回答
反对 回复 2023-12-09
?
qq_花开花谢_0

TA贡献1835条经验 获得超7个赞

一种简单的方法是使用itertools笛卡尔积:

from itertools import product 
L, D = 2, 2 
print(list(product(list(range(L)), repeat = D)))

结果

[(0, 0), (0, 1), (1, 0), (1, 1)]


查看完整回答
反对 回复 2023-12-09
?
素胚勾勒不出你

TA贡献1827条经验 获得超9个赞

你使用递归。第一部分是基本情况,第二部分是为较低维度的格子中的每一项添加从 0 到 L-1 的每个数字


def positions(L,d):

  if d==0:

    return [()]

  else:

    return [(x,)+positions(L,d-1)[y] for x in range(L) for y in range(len(positions(L,d-1)))]



查看完整回答
反对 回复 2023-12-09
  • 3 回答
  • 0 关注
  • 114 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信