В Python, когда вы выполняете цикл непосредственно через итерацию, переменная цикла становится текущим значением, поэтому нет необходимости индексировать исходные списки с помощью depList[dep]
и varSuffix[var]
, но использовать переменные напрямую: dep
и var
,
Кроме того, рассмотрим str.format
для строковой интерполяции, которая является предпочтительным методом Python 3 , а не устаревшей, уменьшенной (не пока устаревшей) строкой по модулю %
оператор:
for dep in depList:
for var in varSuffix:
spssSyntax += '''REGRESSION
/MISSING LISTWISE
/STATISTICS COEFF OUTS R
/CRITERIA=PIN(.05) POUT(.10)
/NOORIGIN
/DEPENDENT {0}
/METHOD=FORWARD iv1 iv2 iv3
/SAVE PRED(PRE_{1})
'''.format(dep, var)
В качестве альтернативы рассмотрите возможность объединения двух списков для одного цикла, используя itertools.product
, а затем используйте понимание списка для построения строки с join
вместо объединения итераций цикла с +=
:
from itertools import product
import spss,spssaux
dependent = ['dv1', 'dv2', 'dv3', 'dv4', 'dv5']
depList = spssaux.VariableDict(caseless = True).expand(dependent)
varSuffix = [1,2,3,4,5]
base_string = '''REGRESSION
/MISSING LISTWISE
/STATISTICS COEFF OUTS R
/CRITERIA=PIN(.05) POUT(.10)
/NOORIGIN
/DEPENDENT {0}
/METHOD=FORWARD iv1 iv2 iv3
/SAVE PRED(PRE_{1})
'''
# LIST COMPREHENSION UNPACKING TUPLES TO FORMAT BASE STRING
# JOIN RESULTING LIST WITH LINE BREAKS SEPARATING ITEMS
spssSyntax = "\n".join([base_string.format(*dep_var)
for dep_var in product(depList, varSuffix)])
Теперь, если вам нужно поэлементно выполнять итерацию между списками равной длины, рассмотрите zip
вместо product
:
spssSyntax = "\n".join([base_string.format(d,v)
for d,v in zip(depList, varSuffix)])
или enumerate
для номера индекса:
spssSyntax = "\n".join([base_string.format(d,i+1)
for i,d in enumerate(depList)])