2011-10-16 89 views
2

如果我可以同時在集合和列表操作,應該返回序列的修飾形式的功能,有沒有辦法保留序列類型,但仍使用理解?例如,如果我使用集合呼叫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。

P.S.我使用Python 3.2.2

+0

你爲什麼要這麼做?我真的不能相信任何比較好的理由...... –

回答

5

有保留序列類型沒有什麼好辦法。正如你所猜測的,如果你真的想這樣做,你將不得不把結果轉換成你想要的類型。你很可能不需要這樣做,所以你應該認真思考。

一個快捷方式,可以幫助你,如果你真的決定要轉換:類型內置序列也可以創建這些序列的構造函數:

def strip_common_path_prefix(seq): 
    # blah blah 
    return prefix, type(seq)(result) 
0

還有就是要做到這一點沒有任何常見的方法類型檢查。另外對於套件,您可以使用一組理解:{ p[prefixlen:] for p in seq }

+0

它已經指定了Python 3是目標,但只是爲了提醒別人誰在看這個,集內涵是唯一的Python 3。對於Python 2,將'{...}'轉換爲'set(...)'。 (請注意,我說的不是字面'Ellipsis'那裏;這只是Python中2的語法項目獲得有效的,反正;) –

+0

沒有,一套內涵Python中可供2.7+。 – refaim

+0

我的歉意;你是對的。 –