在Python中维护集合或列表理解中的序列类型

发布于 2024-12-10 08:15:17 字数 572 浏览 1 评论 0原文

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

If I have a function that can operate on both sets and lists and should return a modified form of the sequence, is there a way to preserve the sequence type but still use a comprehension? For example, in the following if I call stripcommonpathprefix with a set, it works but has the undesired side effect of converting the set to a list. Is it possible to maintain the type (while still using a comprehension) without having to directly check isinstance and then return the correct type based on that? If not, what would be the cleanest way to do this?

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 ]

Thankyou and sorry if this is a basic question. I'm just starting to learn python.

P.S. I'm using Python 3.2.2

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

没有好的方法来保留序列的类型。正如您所猜测的,如果您确实想这样做,则必须将最后的答案转换为您想要的类型。您很可能不需要这样做,因此您应该认真考虑一下。

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

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

There is no good way to preserve the type of the sequence. As you have guessed, if you really want to do this, you will have to convert the answer at the end to the type you want. It's quite likely that you don't need to do this, so you should think hard about it.

One shortcut that might help you if you do decide to convert: the types of the built-in sequences are also constructors that can create those sequences:

def strip_common_path_prefix(seq):
    # blah blah
    return prefix, type(seq)(result)
暮凉 2024-12-17 08:15:17

如果没有类型检查,没有通用的方法可以做到这一点。另外,对于集合,您可以使用集合理解:{ p[prefixlen:] for p in seq }

There is no common way to do this without type checking. Also for sets you can use a set comprehension: { p[prefixlen:] for p in seq }.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文