【问题标题】:for loop in API call returns same result in each loopAPI 调用中的 for 循环在每个循环中返回相同的结果
【发布时间】:2026-02-22 04:25:01
【问题描述】:

我编写了一个循环来根据 id 列表从 API (Limesurvey) 检索数据,并用每个循环的结果填充数据帧的一行。

我有一个这样的 id 列表:

 # list of ids

 ids = ['1','427',... ,'847']

我根据列表中的每一项查询 API 的代码如下所示:

method = "get_participant_properties"
params = OrderedDict([
            ("sSessionKey", api.session_key),
            ("iSurveyID", 12345),
            ("aTokenQueryProperties", t), 
])

# loop through API query with the 'aTokenQueryProperties' stored in the list 'tids'.

attributes = []

for t in ids:
    attributes.append(api.query(method=method, params=params))

pd.DataFrame(attributes)

不幸的是,结果是一个158行的dataframe,每一行都是一样的,即我列表中最后一个id的查询结果(847)。

【问题讨论】:

    标签: json python-3.x api for-loop limesurvey


    【解决方案1】:

    您没有从循环中传递tparams 定义中的t 不相关;如果我现在运行你的代码,我会得到一个NameError 异常,因为此时尚未设置tparams 映射中的 t 表达式不存在,它不会在每次循环迭代时更新。

    在循环中设置'aTokenQueryProperties'

    method = "get_participant_properties"
    params = OrderedDict([
                ("sSessionKey", api.session_key),
                ("iSurveyID", 12345),
                ("aTokenQueryProperties", None), 
    ])
    
    attributes = []
    
    for t in ids:
        params["aTokenQueryProperties"] = t
        attributes.append(api.query(method=method, params=params))
    

    paramsOrderedDict对象的开头将"aTokenQueryProperties"设置为None是可选的;如果在 params 顺序中保留其确切位置很重要,那么您只需要这样做,即使那样,因为在您的示例中它是映射中的 last 元素,您最终会无论如何都具有相同的输出。

    【讨论】: