【发布时间】:2026-02-11 07:40:01
【问题描述】:
下面的代码块可以工作,但是由于我对使用 JSON 的理解有限,我不满意它是非常理想的,但我似乎无法找到更有效的方法。
steam_game_db 是这样的:
{
"applist": {
"apps": [
{
"appid": 5,
"name": "Dedicated Server"
},
{
"appid": 7,
"name": "Steam Client"
},
{
"appid": 8,
"name": "winui2"
},
{
"appid": 10,
"name": "Counter-Strike"
}
]
}
}
到目前为止,我的 Python 代码是
i = 0
x = 570
req_name_from_id = requests.get(steam_game_db)
j = req_name_from_id.json()
while j["applist"]["apps"][i]["appid"] != x:
i+=1
returned_game = j["applist"]["apps"][i]["name"]
print(returned_game)
有没有更聪明的方法来搜索它,而不是遍历整个应用列表?理想情况下,数据结构中具有“appid”和“name”的元素的编号与其对应的“appid”相同
即 列表中的appid 570是Dota2 但是appid 5069和Red Faction中数据结构中的元素570
还有,这是什么类型的数据结构?也许它已经限制了我对这个答案的搜索能力。 (即,对于我来说,每个元素都像是一本包含“appid”和“元素”的字典?)
编辑:按照建议更改为 for 循环
# returned_id string for appid from another query
req_name_from_id = requests.get(steam_game_db)
j_2 = req_name_from_id.json()
for app in j_2["applist"]["apps"]:
if app["appid"] == int(returned_id):
returned_game = app["name"]
print(returned_game)
【问题讨论】:
-
这是一个哈希结构,但最快的方法是将所有内容放入字典中,然后立即进行查找。
-
@user1767754 如果他们只查找一件事,则将整个列表转换为字典平均比只遍历他们想要的内容要慢,尽管随后的查找会很快。
-
你应该考虑你的代码的intent;
for app in j["applist"]["apps"]:比搞乱i要清楚得多,例如,如果 ID(当前名为x,这也没有帮助 - 为什么不app_id?)不存在IndexError的风险没有找到。 -
@jonrsharpe x 对我的坏事没有帮助,我将其更改为一个平淡无奇的变量名以免引起混淆(因为我正在将我的字符串从其他地方转换为 int,它可能看起来位随机/冗余)。我已按照您的建议将其更改为 for ,并且看起来更清晰。找到所需的值后,for循环会继续吗?正如我假设的那样,while循环一旦达到正确的X值就不会继续,从而使用更少的资源?也知道为什么我实际上不需要
j前面的j["applist"]["apps"]并且它仍然有效吗? -
您可以
return(如果在函数中)或break在适当的时候结束循环。
标签: python python-3.x python-requests steam steam-web-api