Слишком много статически вложенных блоков python

Я пытаюсь написать более 21 списков, содержащих одинаковое количество элементов в столбцах в текстовом файле.

import random

a=[]
b=[]
....
q=[]


for i in range(200):
    a.append(random.gauss(10,0.1))
    b.append(random(20,0.5))
    ....
    q.append(random.gauss(50,0.2)

for aVal in a:
    for bVal in b:
        ....
        for qVal in q:
            print(aVal, "\t ", bVal, ", ", .... , qVal)

....

SystemError: too many statically nested blocks

Как я могу записать каждый список в столбец в текстовом файле? например

 0.892550 0.872493 0.206032 2.528080
 0.722350 0.303438 0.176304 2.436103
 0.875931 0.717765 0.144785 2.583095
 0.890831 0.411748 0.124370 2.540974
 0.764183 0.728080 0.128309 2.506590
 0.831232 0.545845 0.130100 2.517765
 0.754441 0.826074 0.208539 2.604585
 0.707450 0.367049 0.198868 2.503152
 0.736103 0.554441 0.097865 2.563324
 0.792837 0.808883 0.179527 2.526361
 0.719484 0.690258 0.215344 2.643266
 0.788252 0.824355 0.189198 2.455874

2 ответа

"слишком много статически вложенных блоков", вы столкнетесь с этой ошибкой, если вложите блоки больше 20.

Это дизайнерское решение интерпретатора python ограничить его до 20. Python использует специальный стек, называемый blockstack, для выполнения блоков кода, таких как исключение и циклы. Этот размер стека ограничен 20.

Тем не менее, следующий код может быть использован в вашем контексте.

lst1 = [1, 11, 111]
lst2 = [2, 22, 222]
lst3 = [3, 33, 333]
lst4 = [4, 44, 444]
lst5 = [5, 55, 555]
lst6 = [6, 66, 666]


def lamlist(l1, l2, l3):
    funs = []
    for i in l1: 
        for j in l2: 
            for k in l3: 
                x = lambda i=i, j=j, k=k: (i,j,k)
                funs.append(x)
    return funs

#def lamlist(l1, l2, l3):
#    return [lambda i=i, j=j, k=k: (i, j, k) for i in l1 for j in l2 for k in l3] 


funlist = [lamlist(lst1, lst2, lst3), lamlist(lst4, lst5, lst6)]

for f1 in funlist[0]:
    a, b, c = f1()
    for f2 in funlist[1]:
        d, e, f = f2()
        print a, b, c, d, e, f

Этот код уменьшает вашу вложенность на 3 уровня.

Использование zip, который, помимо избежания ошибки, будет печатать одну строку на группу значений, а не один набор строк для каждого значения в замкнутом цикле.

for aVal, bVal, ..., qVal in zip(a, b, ..., q):
    print(aVal, "\t ", bval, ", ", ..., qval)
Другие вопросы по тегам