API 中的 for 循环在每个循环中调用 returns 相同的结果

for loop in API call returns same result in each loop

我写了一个循环来根据 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)。

您没有从循环中传入 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))

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