猿问

通过 SPSS 回归映射 Python for 循环

我需要通过我的回归运行两个循环,其中一个是自变量,另一个是我需要在每一轮自变量中保存的预测的后缀。我可以单独执行这些循环中的任何一个,它工作正常,但当我将它们组合在同一个回归中时就不行了。我认为这与我的回归结束时的循环映射有关。我收到错误代码“TypeError:列表索引必须是整数,而不是 str。” 但是,这是因为我的因变量被读取为字符串以从 SPSS 数据框中获取值。有什么方法可以在包含字符串变量的回归中映射 for 循环?


我曾尝试使用 map() 函数,但我得到了不支持迭代的代码。


begin program.

import spss,spssaux

dependent = ['dv1', 'dv2', 'dv3', 'dv4', 'dv5']

spssSyntax = ''

depList = spssaux.VariableDict(caseless = True).expand(dependent)

varSuffix = [1,2,3,4,5]



for dep in depList:

    for var in varSuffix:

        spssSyntax += '''

    REGRESSION 

      /MISSING LISTWISE 

      /STATISTICS COEFF OUTS R

      /CRITERIA=PIN(.05) POUT(.10) 

      /NOORIGIN 

      /DEPENDENT %(dep)s 

      /METHOD=FORWARD  iv1 iv2 iv3

      /SAVE PRED(PRE_%(var)d).

    '''%(depList[dep],varSuffix[var])

end program. 

我收到错误代码“TypeError:列表索引必须是整数,而不是 str”,上面的代码。如何在包含字符串的同时映射循环?


慕斯709654
浏览 247回答 1
1回答

墨色风雨

在 Python 中,当您直接遍历一个可迭代对象时,循环变量将成为当前值,因此无需使用 and 来索引原始列表,depList[dep]而是varSuffix[var]直接使用变量:depand 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 productimport spss,spssauxdependent = ['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 ITEMSspssSyntax = "\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)])
随时随地看视频慕课网APP

相关分类

Python
我要回答