簡體   English   中英

Python 中可變數量的嵌套 for 循環

[英]Variable number of nested for loops in Python

我無法使其正常工作,我們將不勝感激任何幫助。 我想為以下代碼設置可變數量的嵌套 for 循環。 這個想法是將所有可能的組合寫入 csv 文件。

這是我的代碼:`

ka = [0.217, 0.445]
kb = [0.03, 0.05]
kc = [10]
kd = [0.15625, 0.7]
ke = [1.02, 0.78]
La = [0.15, 0.25]
Lb = [0.025, 0.075]
tc = [0.002, 0.007]
Ld = [0.025, 0.115]
Le = [0.07, 0.2]

NUMBER_OF_VARIABLES = 10

with open('test.csv', 'w') as file:
    writer = csv.writer(file, lineterminator = '\n')
    row = [0] * len(NUMBER_OF_VARIABLES)
    
    
    for E in Le:
        for D in Ld:                                    
            for C in tc:
                for B in Lb:
                    for A in La:
                        for e in ke:
                            for d in kd:
                                for c in kc:
                                    for b in kb:
                                        for a in ka:
                                            row[0] = a
                                            row[1] = b
                                            row[2] = c
                                            row[3] = d
                                            row[4] = e
                                            row[5] = A
                                            row[6] = B
                                            row[7] = C
                                            row[8] = D
                                            row[9] = E
                                            writer.writerow(row)

` 這個想法是我希望能夠添加更多或刪除變量。 每個字母的 k 和 L 是相關的。 例如,添加另一個變量將包括 Lf 和 kf。 我想在不手動添加更多循環的情況下這樣做。 如果將其制成一個列表會更好,則不必保留變量結構。

我覺得我需要寫一個遞歸的 function 但我無法解決這個問題,任何幫助將不勝感激。

我嘗試導入一個 csv 文件,其中每一行都有一個變量,但無法計算出 for 循環的可變數量。

您需要的是itertools.product 它將為您處理所有這些。

import itertools
ka = [0.217, 0.445]
kb = [0.03, 0.05]
kc = [10]
kd = [0.15625, 0.7]
ke = [1.02, 0.78]
La = [0.15, 0.25]
Lb = [0.025, 0.075]
tc = [0.002, 0.007]
Ld = [0.025, 0.115]
Le = [0.07, 0.2]

for row in itertools.product(ka,kb,kc,kd,ke,La,Lb,tc,Ld,Le):
    writer.writerow(row)

你甚至可以在一行中做到這一點:

writer.writerows(itertools.product(ka,kb,kc,kd,ke,La,Lb,tc,Ld,Le))

嘗試使用itertools.product

ka = [0.217, 0.445]
kb = [0.03, 0.05]
kc = [10]
kd = [0.15625, 0.7]
ke = [1.02, 0.78]
La = [0.15, 0.25]
Lb = [0.025, 0.075]
tc = [0.002, 0.007]
Ld = [0.025, 0.115]
Le = [0.07, 0.2]

from itertools import product
with open('test.csv', 'w') as file:
    writer = csv.writer(file, lineterminator = '\n')
    writer.writerows(product(ka, kb, kc, kd, ke, La,Lb, tc, Ld, Le)

如您所見 - Python 確實具有處理這種情況的內置工具。 否則,如果 iterttols package 不存在,則執行此類操作的方法是使用函數,然后遞歸調用 - 類似於

def product(*args):
    if not args: return []
    remainder = product(*args[1:])
    result = []
    for item in args[0]:
        if remainder:
            for part in remainder:
                row = [item, *part]
                result.append(row)
        else:
            result.append([item,])
    return result

暫無
暫無

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

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