Поддержание типа последовательности в понимании набора или списка в python

#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 .