Python 当然,必须有一个更干净的方法来做到这一点

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":

我正在建立一个机器人,可以显示一些统计数据

我从一个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": "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]
。好的,谢谢,我一直在找这样的东西。