Python 当然,必须有一个更干净的方法来做到这一点
我正在建立一个机器人,可以显示一些统计数据 我从一个API得到这样的响应:Python 当然,必须有一个更干净的方法来做到这一点,python,arrays,json,dictionary,Python,Arrays,Json,Dictionary,我正在建立一个机器人,可以显示一些统计数据 我从一个API得到这样的响应: "lifeTimeStats": [ { "key": "Top 5s", "value": "51" }, { "key": "Top 3s", "value": "69" }, { "key": "Top 6s", "value": "120" }, { "key": "Top 10", "value": "66" }, { "key": "Top 12s", "value":
"lifeTimeStats": [
{
"key": "Top 5s",
"value": "51"
},
{
"key": "Top 3s",
"value": "69"
},
{
"key": "Top 6s",
"value": "120"
},
{
"key": "Top 10",
"value": "66"
},
{
"key": "Top 12s",
"value": "122"
},
{
"key": "Top 25s",
"value": "161"
},
{
"key": "Score",
"value": "235,568"
},
{
"key": "Matches Played",
"value": "1206"
},
{
"key": "Wins",
"value": "49"
},
{
"key": "Win%",
"value": "4%"
},
{
"key": "Kills",
"value": "1293"
},
{
"key": "K/d",
"value": "1.12"
}
],
以下是我格式化此JSON的代码:
def __getitem__(self, items):
new_list = []
new_list2 = []
new_list3 = []
new_list4 = []
for item in self.response['lifeTimeStats']:
for obj in item.items():
for object in obj:
new_list.append(object)
for item in new_list[1::2]:
new_list2.append(item)
for item in new_list2[::2]:
new_list3.append(item)
for item in new_list2[1::2]:
new_list4.append(item)
result = dict(zip(new_list3, new_list4))
return result[items]
结果是:
{
'Top 5s': '1793',
'Top 3s': '1230',
'Top 6s': '1443',
'Top 10': '2075',
'Top 12s': '2116',
'Top 25s': '2454',
'Score': '4,198,425',
'Matches Played': '10951',
'Wins': '4077',
'Win%': '37%',
'Kills': '78836',
'K/d': '11.47'
}
我对结果很满意,我只是在想,是否有更好的方式来格式化它?更干净的方式
我现在正在学习,我想看看有没有人对此有什么想法
以下是我在此之后获取信息的方式:
f = Fortnite('PlayerName')
f['Matches Played']
您可以使用简单的听写理解来迭代结果,即:
def __getitem__(self, item):
return {x["key"]: x["value"] for x in self.response["lifeTimeStats"]}[item]
也就是说,为什么每当您想要检索某个特定项时,您总是要迭代响应?您应该缓存结果,然后作为普通dict访问它
或者,由于您只对一个键感兴趣,您可以执行以下操作:
def __getitem__(self, item):
for stat in self.response["lifeTimeStats"]:
if stat["key"] == item:
return stat["value"]
您可以使用简单的听写理解来迭代结果,即:
def __getitem__(self, item):
return {x["key"]: x["value"] for x in self.response["lifeTimeStats"]}[item]
也就是说,为什么每当您想要检索某个特定项时,您总是要迭代响应?您应该缓存结果,然后作为普通dict访问它
或者,由于您只对一个键感兴趣,您可以执行以下操作:
def __getitem__(self, item):
for stat in self.response["lifeTimeStats"]:
if stat["key"] == item:
return stat["value"]
“更好”或“更干净”到底是怎么回事?你打算用这些数据做什么,机器可读和人类可读都有意义吗?最终的结果是你可以向机器人询问特定fortnite玩家的统计数据,他会返回这些数据。我还没有完成那部分,但我想要一本字典,这样我就可以很容易地按键获取数据。而且更干净,我认为使用6 for循环可能是不必要的?工作代码应该发布到代码审查“更好”或“更干净”中,确切地说,如何?你打算用这些数据做什么,机器可读和人类可读都有意义吗?最终的结果是你可以向机器人询问特定fortnite玩家的统计数据,他会返回这些数据。我还没有完成那部分,但我想要一本字典,这样我就可以很容易地按键获取数据。更干净的是,我认为使用6 for循环可能是不必要的?工作代码应该发布到CodeReviewKey。这是有道理的。因为最好能多取几把钥匙。因此,也许我应该在初始化类时运行此函数,并将其存储在一个变量中,然后访问该变量?@Daniel-是的,差不多-只要您的
self.response
可用(或更新),就将结果存储为,例如,self.stats={x[“key”]:x[“value”]代表self.response中的x[“lifeTimeStats”]}
,然后您可以在\uuu getitem\uuuu()
方法中将缓存结果转发为:返回self.stats[item]
。好的,谢谢。我一直在寻找这样的东西。好的。这是有道理的。因为能够访问更多的键会更好。因此,也许我应该在初始化类时运行此函数,并将其存储在变量中,然后改为访问变量?@Daniel-是的,差不多-只要你的se如果.response
变为可用(或更新),则将结果存储为,例如,self.response[“lifeTimeStats”]}中x的self.stats={x[“key”]:x[“value”],
方法中的缓存结果转发为:返回self.stats[item]
。好的,谢谢,我一直在找这样的东西。