【问题标题】:Maintaining sequence type in set or list comprehension in python在 python 中维护集合或列表理解中的序列类型
【发布时间】:2011-12-08 17:33:28
【问题描述】:

如果我有一个可以同时对集合和列表进行操作的函数并且应该返回序列的修改形式,有没有办法保留序列类型但仍然使用推导式?例如,在下面,如果我用集合调用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。

附注我正在使用 Python 3.2.2

【问题讨论】:

  • 为什么需要这样做?我真的想不出任何好的理由......

标签: python list python-3.x set list-comprehension


【解决方案1】:

没有很好的方法来保存序列的类型。如您所料,如果您真的想这样做,则必须将最后的答案转换为您想要的类型。很有可能你不需要这样做,所以你应该好好考虑一下。

如果您决定转换,一个捷径可能会对您有所帮助:内置序列的类型也是可以创建这些序列的构造函数:

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

【讨论】:

    【解决方案2】:

    没有类型检查就没有常用的方法。同样对于集合,您可以使用集合理解:{ p[prefixlen:] for p in seq }

    【讨论】:

    • 已指定 Python 3 是目标,但只是为了提醒其他正在查看此内容的人,集合推导仅适用于 Python 3。对于 Python 2,将 {...} 转换为 set(...)。 (请注意,我不是指那里的文字 Ellipsis;无论如何,它仅在 Python 2 语法中的项目访问中有效;)
    • 不,集合推导在 Python 2.7+ 中可用。
    猜你喜欢
    • 1970-01-01
    • 2015-06-27
    • 2016-05-24
    • 2016-06-16
    • 1970-01-01
    • 2023-03-20
    • 1970-01-01
    • 2021-11-11
    • 2014-06-11
    相关资源
    最近更新 更多