Как распечатать фрагмент Python в виде строки, разделенной знаком «:»?

У меня есть объект срез, и я хотел бы распечатать его в виде строки start:stop:step. Как мне это сделать?

По вашей ссылке «Объекты среза имеют атрибуты данных только для чтения start, stop и step, которые просто возвращают значения аргументов (или их значения по умолчанию)».

jodag 21.06.2024 01:46
s = slice(1, 2, 3); print(f"{s.start}:{s.stop}:{s.step}") ?
Andrej Kesely 21.06.2024 01:47

Нет ничего встроенного, что могло бы сделать это AFAIK. Вам нужно будет написать собственный код форматирования, используя атрибуты start, stop и step объекта.

Barmar 21.06.2024 01:47

@AndrejKesely Это не сработает, если какой-либо из атрибутов равен None, который используется для значений по умолчанию.

Barmar 21.06.2024 01:47

@AndrejKesely Если шаг установлен по умолчанию, вам обычно нужен просто start:stop, а не start:stop:

Barmar 21.06.2024 01:49
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
5
79
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Не зацикливайтесь на этом:

my_slice = slice(1,False,3)
print(f'{my_slice.start if my_slice.start is not None else ""}:{my_slice.stop if my_slice.stop is not None else ""}{(":"+str(my_slice.step)) if my_slice.step is not None else ""}')

Repl.it

А как насчет slice(1, 10)? В идеале это должно давать 1:10, а не 1:10:.

Barmar 21.06.2024 01:51

@Barmar 1:10 и 1:10: не эквивалентны функционально? Для меня не было бы шоком, если бы ответ был «нет», но я никогда не сталкивался с таким в своем опыте.

esqew 21.06.2024 01:55

@esqew Вот почему я сказал «в идеале». Я думаю, что они эквивалентны, но дополнительный : не является питоническим.

Barmar 21.06.2024 02:07

@Barmar Конечно, для меня это имеет смысл. Обновленный фрагмент должен решить эту проблему. Спасибо, как всегда!

esqew 21.06.2024 02:08

@esqew 1:10 и 1:10: эквивалентны. Оба они приводят к slice(1, 10, None).

wjandrea 21.06.2024 02:23

Я только что понял, что строки также являются допустимыми значениями, например. my_slice = slice('') должно быть :'', а не :. Я обновил свой ответ. Для себя можно использовать repr(my_slice.<start/stop>) if ... и ":"+repr(my_slice.step). Чтобы внести ясность: строки не используются в стандартной библиотеке AFAIK, но они используются, по крайней мере, в Pandas.

wjandrea 21.06.2024 03:12

Или даже в стандартной библиотеке вам нужно различать такие ошибки, как slice('9') и slice(9).

wjandrea 21.06.2024 03:19
Ответ принят как подходящий

Насколько я знаю, для этого нет ничего встроенного, но мы можем легко написать код для этого, используя значения из объекта среза, согласно документации :

Объекты среза имеют атрибуты данных start, stop и step, доступные только для чтения, которые просто возвращают значения аргументов (или их значения по умолчанию).

В самом простом

def slice_to_str(s: slice) -> str:
    return f'{s.start!r}:{s.stop!r}:{s.step!r}'

Например:

>>> print(slice_to_str(slice(15, 95, 5)))
15:95:5
>>> print(slice_to_str(slice(60)))
None:60:None

Если вы хотите удалить Nones

Вы можете использовать ... is not None else ''

def slice_to_str(s: slice) -> str:
    start, stop, step = [
        (repr(val) if val is not None else '')
        for val in [s.start, s.stop, s.step]]
    return f'{start}:{stop}:{step}'

Например:

>>> print(slice_to_str(slice(60)))
:60:
>>> print(slice_to_str(slice(None)))
::
>>> print(slice_to_str(slice(None, None, 2)))
::2
>>> print(slice_to_str(slice('h', 't')))
'h':'t':

Если вы хотите удалить последнее двоеточие на шаге None

Просто добавьте галочку: if s.step is None ...

def slice_to_str(s: slice) -> str:
    start, stop, step = [
        (repr(val) if val is not None else '')
        for val in [s.start, s.stop, s.step]]
    step_optional = f':{step}' if s.step is not None else ''
    return f'{start}:{stop}{step_optional}'

Например:

>>> print(slice_to_str(slice(60)))
:60
>>> print(slice_to_str(slice(None)))
:
>>> print(slice_to_str(slice(None, None, 2)))
::2

Другие вопросы по теме