Проблема с преобразованием списка

Рейтинг: 0Ответов: 2Опубликовано: 15.01.2023

начинаю потихоньку изучать 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 имеет более гармоничное решение, прошу вашей помощи. Заранее спасибо

Ответы

▲ 0Принят

Пример парсинга через регулярное выражение.

Функция 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)
▲ 0

Парсить строки можно через 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)