簡體   English   中英

循環問題

[英]For-Loop Problems

我有以下函數,例如,它將包含大小為NxN的2D列表的列表:

print(matrix)

[

[ [1.0, 2.0, 3.0, 4.0], 
  [5.0, 6.0, 7.0, 8.0], 
  [1.0, 2.0, 3.0, 4.0], 
  [5.0, 6.0, 7.0, 8.0] ], 
[ [2.0, 3.0, 4.0, 5.0], 
  [7.0, 8.0, 9.0, 1.0], 
  [8.0, 0.0, 2.0, 4.0], 
  [1.0, 9.0, 5.0, 8.0] ]

]

每個“矩陣”實際上都是2D列表,尺寸均為4。 使“矩陣”成為具有兩個2D列表條目的3D列表。 下面的函數將包含2D列表的維數,一些時間段(例如3),age_classes(再次假設為3)和“值”,它們將是上面的3D列表。

def initial_values_ext(dimension,periods,age_classes,values):

    dicts = {}
    dict_keys = range(dimension)
    time_keys = range(periods)
    age_keys = range(age_classes)

    for i in dict_keys:
        for j in dict_keys:
            for t in time_keys:
                for k in age_keys:
                    if t == 0:
                        dicts[i+1,j+1,t+1,k+1] = values[k][i][j]
                    else:
                        dicts[i+1,j+1,t+1,k+1] = 1
    return dicts

然后,函數“ initial_values_ext”將傳遞這些2D列表並生成一個字典。 每個2D列表都對應一個年齡類別-因此第一個2D列表將為age_classes = 1,第二個2D列表將為age_classes = 2,如果還有其他2D列表,則它將對應於age_classes = 3,依此類推。 。 因此,如果我們要調用該函數,那么幾個輸出可能如下所示:

initial_values_ext(dimension=4, periods=3, age_classes=2,values=matrix)

(1,1,1,1):1.0
(1,1,1,2):2.0
(1,1,2,2):1.0

(3,4,1,1):7.0
(3,4,1,2):5.0
(3,4,2,1):1.0

因此,最終輸出將是一個完整的值字典,其起始值是(1,1,1,age_class = 1):1.0,結束於(4,4,2,age_class = 2):8.0。 重要的是,當age_class = 1時,結果字典將從'matrix'的第一個2D列表中提取,而在age_class = 2時將從'matrix'的第二個2D列表中提取

編輯:在下面,我包括了當輸入矩陣僅是列表列表且沒有字典的第四個條目時所執行的代碼。

matrix = [[1.0, 2.0, 3.0, 4.0], [5.0, 6.0, 7.0, 8.0], [1.0, 2.0, 3.0, 4.0], [5.0, 6.0, 7.0, 8.0]]

def initial_values(dimension,periods,values):
    dicts = {}
    dict_keys = range(dimension)
    time_keys = range(periods)
    for i in dict_keys:
        for j in dict_keys:
            for t in time_keys:
                if t == 0:
                    dicts[i+1,j+1,t+1] = values[i][j]
                else:
                    dicts[i+1,j+1,t+1] = 1
    return dicts

輸出:

initial_values(4,2,matrix)

{(1, 1, 1): 1.0,
 (1, 1, 2): 1,
 (1, 2, 1): 2.0,
 (1, 2, 2): 1,
 (1, 3, 1): 3.0,
 (1, 3, 2): 1,
 (1, 4, 1): 4.0,
 (1, 4, 2): 1,
 (2, 1, 1): 5.0,
 (2, 1, 2): 1,
 (2, 2, 1): 6.0,
 (2, 2, 2): 1,
 (2, 3, 1): 7.0,
 (2, 3, 2): 1,
 (2, 4, 1): 8.0,
 (2, 4, 2): 1,
 (3, 1, 1): 1.0,
 (3, 1, 2): 1,
 (3, 2, 1): 2.0,
 (3, 2, 2): 1,
 (3, 3, 1): 3.0,
 (3, 3, 2): 1,
 (3, 4, 1): 4.0,
 (3, 4, 2): 1,
 (4, 1, 1): 5.0,
 (4, 1, 2): 1,
 (4, 2, 1): 6.0,
 (4, 2, 2): 1,
 (4, 3, 1): 7.0,
 (4, 3, 2): 1,
 (4, 4, 1): 8.0,
 (4, 4, 2): 1}

我進行了一些修改,以使您的方法更加Python化。

def initial_values_ext(dimension, periods, age_classes, values):
    x = list(map(range,[dimension, periods, age_classes]))
    dicts = {(i+1,j+1,t+1,k+1) : values[k][i][j] if t==0 else 1 \
             for i in x[0] for j in x[0] for t in x[1] for k in x[2]}
    return dicts

調用“值”時,函數調用缺少附加的循環索引:

def initial_values_ext(dimension,periods,age_classes,values):

    dicts = {}
    dict_keys = range(dimension)
    time_keys = range(periods)
    age_keys = range(age_classes)

    for i in dict_keys:
        for j in dict_keys:
            for t in time_keys:
                for k in age_keys:
                    if t == 0:
                        dicts[i+1,j+1,t+1,k+1] = values[k][i][j] 
                    else:
                        dicts[i+1,j+1,t+1,k+1] = 1
    return dicts

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM