python - 将对象的属性转换为已排序的元组列表的首选技术是什么?

标签 python sorting

我正在使用一个开源库,他们定义了一个这样的类:

class Provider(object):
    """ Defines for each of the supported providers """
    DUMMY = 0
    EC2 = 1
    EC2_EU = 2
    RACKSPACE = 3
    SLICEHOST = 4
    GOGRID = 5
    VPSNET = 6
    LINODE = 7
    VCLOUD = 8
    RIMUHOSTING = 9

我需要获取属性(DUMMY、EC2 等)并将它们转换为经过排序的元组列表,如下所示:

[(0, 'DUMMY'), (1, 'EC2'), ...]

我想根据属性本身的名称进行排序。我想出了一些方法来解决这个问题,包括以下似乎是一种低效的处理方法:

import operator
from libcloud.types import Provider

PROVIDER_CHOICES = [(v,k) for k, v in vars(Provider).items()
                                   if not k.startswith('__')]
PROVIDER_CHOICES = sorted(PROVIDER_CHOICES, key=operator.itemgetter(1))

它有效,但看起来不够优雅,而且可能有更好的方法。我还看到我通过执行 if not k.startswith('__') 构建列表的方式存在缺陷 - 主要是如果开源库向 Provider 类添加方法怎么办?

只是寻找一些意见和其他可能对此更有效的技术。

最佳答案

如果你正在寻找整数类型的类变量,你可以这样做:

import inspect
PROVIDER_CHOICES = inspect.getmembers(Foo, lambda x: isinstance(x, int))

查看 inspect模块以获取更多信息。


顺便说一句:您可以在最后一行使用 PROVIDER_CHOICES.sort(key=...),它会进行就地排序。

编辑:getmembers 返回文档中所述的排序列表,因此不需要 sorted(感谢 J.F. Sebastian)

关于python - 将对象的属性转换为已排序的元组列表的首选技术是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1815693/

相关文章:

python - 如何使Docker容器永远运行

python - 在 Python 中使用其他 JSON 更改 JSON 值

java - 如何在 Java 中对泛型类型列表进行排序

c# - 如何让 OrderBy 或 IComparer 对我的特定列表进行排序?

Javascript - 排序字母然后数字

string - python3 sum in stings 每个字母值

C++ 对对象 vector 进行排序,出现错误 C3867 函数调用缺少参数列表?

python - 使用 selenium 和 python 抓取 Instagram 关注者页面

python - 使用jinja中的变量动态加载CSS

python - Matplotlib 3d 散点图缺少颜色图