Для функции у меня есть параметр, который представляет собой Последовательность. Я хотел бы вернуть другую последовательность (того же типа) с одним элементом в данной последовательности.
def get_element_at_index_as_list(some_seq : Sequence, index: int):
# return some_magic(some_seq[index])
# s.t. type(some_magic(some_seq[i])) == type(some_seq)
Да, что сказал @khelwood. Если вы return some_seq[index:index+1]
вы получите строку some_seq
это строка, кортеж, если это кортеж, и т. д.
Пожалуйста, объясните, где вы застряли. Sequence
требуется метод index
. Разве это не дает вам прямого решения?
Я считаю, что должна быть возможность вернуть фрагмент данной последовательности.
Например.
return some_seq[index:index+1]
до тех пор, пока тип последовательности, который вы получаете, поддерживает срезы (и использует объекты своего собственного типа для срезов). Он работает как минимум для строки, списка и кортежа. Работает даже для range
объектов.
Как указывает ShadowRanger в комментарии, это не работает для collections.deque
, так как он не поддерживает нарезку. Я не думаю, что существует единственный способ, который работает для всех возможных типов последовательностей (тем более, что пользователи могут регистрировать свои собственные типы последовательностей).
Вот способ, который работает для deque
(и большинства других типов последовательностей), но не работает для строки:
return type(some_seq)([some_seq[index]])
Нарезка работает для каждого встроенного (включая все модули, доступные в базовой установке) типа последовательности, о котором я знаю, за одним вопиющим исключением, collections.deque
, у которого нет реальных причин опускать его, кроме легкой идиосинкразии deque
, позволяющей максимальная длина и отсутствие согласия в отношении того, какой должна быть семантика нарезки ограниченной по длине deque
(должна ли она потерять ограничение? сохранить ограничение и молча вести себя иначе, чем другие изменяемые последовательности, когда вы append
к ней позже?). Однако массивы ctypes
и mmap
не сохранят тип (вы получите list
или bytes
обратно).
Я искал return type(some_seq)([some_seq[index]])
, так как он должен работать для любой последовательности, обеспечивающей преобразование из списка. 😊
def get_element_at_index_as_list(some_seq : Sequence, index: int):
return some_seq[index:index+1]
Я думаю, взять кусок длины 1 из последовательности. Я думаю, что это работает для обычных типов последовательностей.