#python #list #python-3.x #set #list-comprehension
#python #Список #python-3.x #набор #понимание списка
Вопрос:
Если у меня есть функция, которая может работать как с наборами, так и со списками и должна возвращать измененную форму последовательности, есть ли способ сохранить тип последовательности, но при этом использовать понимание? Например, в следующем, если я вызываю stripcommonpathprefix
с набором, это работает, но имеет нежелательный побочный эффект преобразования набора в список. Возможно ли поддерживать тип (все еще используя понимание) без необходимости прямой проверки isinstance
, а затем возвращать правильный тип на основе этого? Если нет, то каков был бы самый чистый способ сделать это?
def commonpathprefix(seq):
return os.path.commonprefix(seq).rpartition(os.path.sep)[0] os.path.sep
def stripcommonpathprefix(seq):
prefix = commonpathprefix(seq)
prefixlen = len(prefix)
return prefix, [ p[prefixlen:] for p in seq ]
Спасибо и извините, если это основной вопрос. Я только начинаю изучать python.
PS Я использую Python 3.2.2
Комментарии:
1. Зачем вам это нужно? Я не могу придумать ни одной веской причины…
Ответ №1:
Нет хорошего способа сохранить тип последовательности. Как вы уже догадались, если вы действительно хотите это сделать, вам нужно будет преобразовать ответ в конце в нужный вам тип. Вполне вероятно, что вам не нужно этого делать, поэтому вам следует хорошенько подумать об этом.
Один ярлык, который может помочь вам, если вы решите преобразовать: типы встроенных последовательностей также являются конструкторами, которые могут создавать эти последовательности:
def strip_common_path_prefix(seq):
# blah blah
return prefix, type(seq)(result)
Ответ №2:
Не существует общего способа сделать это без проверки типа. Также для наборов вы можете использовать понимание набора: { p[prefixlen:] for p in seq }
.
Комментарии:
1. Было указано, что Python 3 является целью, но просто чтобы напомнить всем, кто смотрит на это, понимание набора доступно только для Python 3. Для Python 2 превратитесь
{...}
вset(...)
. (Обратите внимание, что я не имею в виду литералEllipsis
там; в любом случае, он действителен только при доступе к элементам в грамматике Python 2;)2. Нет, понимание набора доступно в Python 2.7 .