"красивое" изменение строки

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

Коллеги вопрос по строкам в питоне: Есть список примерно следующий:

[['qwe', '123'], ['asdfd', 'qwe'], ['123', 'asd']]

на выходе мне нужно получить строку:

([qwe] 123, [asdfd] qwe, [123], asd)

на данный момент я использую следующий механизм (и с задачей справляется):

test = str(test).replace("', '", '] ').replace("'],", ', ').replace("[['", "([").replace("]]", ")]").replace("['", "[").replace("')]", ")")

но честно говоря код смотрится не очень эстетично! Есть ли механизмы позволяющие изящно обойти повторяющиеся конструкции .replace? Спасибо!

Ответы

▲ 8

Просто сразу создавайте строку нужного вида:

lst = [['qwe', '123'], ['asdfd', 'qwe'], ['123', 'asd']]
s = "({})".format(", ".join(f"[{first}] {second}" for first, second in lst))
print(s)

Вывод:

([qwe] 123, [asdfd] qwe, [123] asd)
▲ 1

Красота в глазах смотрящего. На мой взгляд, ничего красивее функционального стиля пока не изобрели. А в сочетании с ООП получается еще лучше.

import dataclasses
import itertools
from typing import Any, Iterable


# более релевантное имя класса и полей задайте самостоятельно
@dataclasses.dataclass
class MyRecord:
    field1: str
    field2: str

    def __str__(self) -> str:
        return f'[{self.field1}] {self.field2}'


def comma_separated(xs: Iterable[Any]) -> str:
    return ', '.join(f'{x}' for x in xs)


def parens(x: Any) -> str:
    return f'({x})'


data = [['qwe', '123'], ['asdfd', 'qwe'], ['123', 'asd']]
records = itertools.starmap(MyRecord, data)
print(parens(comma_separated(records)))
▲ 0

Ну как вариант:

lst = [['qwe', '123'], ['asdfd', 'qwe'], ['123', 'asd']]
string = f'({", ".join([f"[{i[0]}] {i[1]}" for i in lst])})'