2011-10-16 41 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

我的歉意;你是对的。 –