Проблема с преобразованием списка
начинаю потихоньку изучать Python возникла проблема После вызова отработки функции получаю ответ типа:
user = ["Player(index=0, name='user1', score=5, time=2),"
"Player(index=1, name='user2', score=4, time=2),"
"Player(index=2, name='user3', score=3, time=3"]
Прошу подсказки как из этого получить результат цикла for с user1 - 5, user2 - 4 ,user3 - 3.
class Player(metaclass=DataclsMeta):
"""Apparently an entry index, but seems to be always 0"""
index: int
"""Name of the player"""
name: str
"""Score of the player"""
score: int
"""Time the player has been connected to the server"""
duration: float
def deserialize_response(reader, response_type, ping):
player_count = reader.read_uint8()
resp = [
Player(
index=reader.read_uint8(),
name=reader.read_cstring(),
score=reader.read_int32(),
duration=reader.read_float()
)
for player_num in range(player_count)
]
return resp
Пытался сделать из списка строку, потом преобразовал ее обратно в список с помощью split(',"Player(') но это все не то, python имеет более гармоничное решение, прошу вашей помощи. Заранее спасибо
Ответы (2 шт):
Парсить строки можно через eval, но тут нужно доверять или проверять входящие строки, чтобы что-нибудь плохое туда не подсунули
dataclass добавил, чтобы сгенерировался конструктор и человеко-читаемое описание объекта по его полям
Пример:
from dataclasses import dataclass
@dataclass
class Player:
"""Apparently an entry index, but seems to be always 0"""
index: int
"""Name of the player"""
name: str
"""Score of the player"""
score: int
"""Time the player has been connected to the server"""
duration: float
player = eval("Player(index=0, name='user1', score=5, duration=2)")
print(player)
# Player(index=0, name='user1', score=5, duration=2)
Пример парсинга через регулярное выражение.
Функция re.findall вернет список из кортежей с найденными значениями
Пример:
import re
from dataclasses import dataclass
@dataclass
class Player:
"""Apparently an entry index, but seems to be always 0"""
index: int
"""Name of the player"""
name: str
"""Score of the player"""
score: int
"""Time the player has been connected to the server"""
duration: float
# Тут по-сути список из одного элемента - строки, описывающей коллекцию Player
user = ["Player(index=0, name='user1', score=5, time=2),"
"Player(index=1, name='user2', score=4, time=2),"
"Player(index=2, name='user3', score=3, time=3"]
text = user[0]
items = re.findall(r"index=(\d+), name='(.+?)', score=(\d+), time=(\d+)", text)
print(items)
# [('0', 'user1', '5', '2'), ('1', 'user2', '4', '2'), ('2', 'user3', '3', '3')]
for index, name, score, time in items:
player = Player(int(index), name, int(score), int(time))
print(player)
Результат из цикла:
Player(index=0, name='user1', score=5, duration=2)
Player(index=1, name='user2', score=4, duration=2)
Player(index=2, name='user3', score=3, duration=3)