Как я могу разделить полезную информацию из этой строки и вывести ее отдельно?

#python #discord #steam-web-api

Вопрос:

Я использую api steam с python и возвращаю недавно сыгранные игры пользователя. Он возвращает это (хотя и до тех пор, пока пользователь запустил столько игр за последние две недели, поэтому мне также нужно будет ограничить количество, указанное в строке). [<SteamApp «Блендер» (365670)>, <SteamApp «Блендер» (365670)><SteamApp «fpsVR» (908520)>, <SteamApp «fpsVR» (908520)><SteamApp «Инструментарий OVR» (1068820)>, <SteamApp «Инструментарий OVR» (1068820)><SteamApp «SteamVR» (250820)>]

Мой код выглядит следующим образом:

     async def recently_played(self, ctx, userurl):
        steam_user = steamapi.user.SteamUser(userurl=userurl)
        await ctx.send(steam_user.recently_played)
 

Я попытался убрать речевые знаки, квадратные скобки, стрелки и запятые, но подумал… что, если в игре есть эти имена? Я также не мог понять, как вставлять между скобками, чтобы избавиться от кода SteamAppID.

Комментарии:

1. Вы уверены, что получаете обратно ниточку? print(type(whatever_that_is)) — это подозрительно похоже на повторение по умолчанию из списка объектов Python. Начинающие программисты часто путают строку, которую они получают при печати чего-либо, с реальной вещью. Если на самом деле это список, то print(type(whatever_that_is[0])) посмотрите, что это за объекты. Тогда вы должны иметь доступ к их атрибутам, например for game in game_list: print(game.name) , предполагая, что у них есть name атрибут.


Ответ №1:

То, что у вас есть, — это не строка или список строк, это список SteamApp объектов. Просто получите доступ SteamApp к свойству каждого name объекта, чтобы создать список имен или просто распечатать их. Нет необходимости выполнять все эти манипуляции со строками:

 names = [app.name for app in user.recently_played] # a list of strings
 

Или:

 for app in user.recently_played:
    print(app.name)
 

Взгляните на исходный код SteamUser.recently_played и SteamApp.name .

Комментарии:

1. Хорошее решение. Это возможно при форматировании строк (при условии, что в качестве строки можно использовать steam_user.recently_played), но доступ к свойствам объекта лучше.

2. @paul M как я могу ограничить отображаемую сумму?

3. Вы можете разрезать исходный список, заменив user.recently_played его на user.recently_played[0:3] — в этом случае сохранив только первые три элемента в списке.

Ответ №2:

Если вы просто пытаетесь получить легко читаемый список игр, вы можете сделать что-то подобное, если данные, которые вы получаете, представляют собой строку:

 # get this string from steam_user.recently_played
unformatted = '[<SteamApp "Blender" (365670)>, <SteamApp "fpsVR" (908520)>, <SteamApp "OVR Toolkit" (1068820)>, <SteamApp "SteamVR" (250820)>]'

gameList = unformatted.split('"')[1::2] # returns a list of the games. This is also possible with a regular expression
games = ", ".join(gameList)

print(games)
# returns Blender, fpsVR, OVR Toolkit, SteamVR
 

Комментарии:

1. чтобы красиво напечатать список, вы можете использовать ", ".join(gameList) однострочный без конца ,

2. @Trevis Спасибо, я отредактирую свой ответ, чтобы добавить это.

3. Но как бы я напечатал все это в одной строке? Хотя это похоже на решение

4. Проблема в том, @Spencer1O1, что фактический «неформатированный» — это список..