【问题标题】:Surely there must be a cleaner way to do this当然必须有一种更清洁的方法来做到这一点
【发布时间】:2018-09-19 11:07:54
【问题描述】:

我正在构建一个可以显示一些统计数据的机器人。

我从一个 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']

【问题讨论】:

  • "better""cleaner" 究竟如何?您打算将这些数据用于什么用途,机器可读、人类可读是否有意义?
  • 最终结果是您可以向机器人询问特定堡垒之夜玩家的统计数据,他将返回此数据。我还没有完成那部分,但我想要一本字典,这样我就可以轻松地按键获取数据。而且更清洁,我在想使用 6 个 for 循环可能是不必要的?
  • 工作代码应该发布到代码审查中

标签: python arrays json dictionary


【解决方案1】:

您可以使用简单的 dict 理解来迭代结果,即:

def __getitem__(self, item):
    return {x["key"]: x["value"] for x in self.response["lifeTimeStats"]}[item]

话虽如此,当您想要检索特定项目时,为什么要一直迭代响应?您应该缓存结果,然后将其作为普通字典访问。

或者,由于您只对一个键感兴趣,您可以这样做:

def __getitem__(self, item):
    for stat in self.response["lifeTimeStats"]:
        if stat["key"] == item:
            return stat["value"]

【讨论】:

  • 好吧。那讲得通。因为能够访问更多的密钥会更好。所以也许我应该在类的初始化时运行这个函数,并将它存储在一个变量中,然后访问这个变量?
  • @Daniel - 是的,差不多 - 每当您的 self.response 可用(或更新)时,将结果存储为,例如,self.stats = {x["key"]: x["value"] for x in self.response["lifeTimeStats"]},然后您可以将缓存的结果转发到__getitem__() 方法为:return self.stats[item] .
  • 好的,谢谢,我正在寻找类似的东西。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多