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)。
您没有从循环中传入 t
。 params
定义中的 t
是无关的;如果我现在要 运行 你的代码,我会得到一个 NameError
异常,因为那时还没有设置 t
。 params
映射中的 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 元素,无论如何你最终会得到相同的输出。
我写了一个循环来根据 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)。
您没有从循环中传入 t
。 params
定义中的 t
是无关的;如果我现在要 运行 你的代码,我会得到一个 NameError
异常,因为那时还没有设置 t
。 params
映射中的 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 元素,无论如何你最终会得到相同的输出。