Конечно, должен быть более чистый способ сделать это - PullRequest
0 голосов
/ 19 сентября 2018

Я строю бота, который может отображать некоторую статистику.

Я получаю этот ответ от 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']

1 Ответ

0 голосов
/ 19 сентября 2018

Вы можете использовать простое понимание диктов для итерации по результатам, то есть:

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"]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...