亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何創建一個具有可變數量“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 關注
  • 177 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號