在__iter__上排序字典

5 投票
4 回答
854 浏览
提问于 2025-04-11 09:18

我想根据字典的键来排序,然后在一个类里重写的迭代方法中返回一个值的迭代器。有没有比创建一个新列表、在排序过程中把值插入到这个列表里更好、更有效的方法呢?

4 个回答

3
def sortedDict(dictobj):
    return (value for key, value in sorted(dictobj.iteritems()))

这段话的意思是,这个方法会生成一个中间的列表,而'sorted()'这个方法会返回一个真正的列表。不过至少它只会生成一个列表。

3

最简单的方法,几乎可以说是最快的,类似于下面这样:

def sorted_dict(d):
    keys = d.keys()
    keys.sort()
    for key in keys:
        yield d[key]

要排序,必须先获取所有的键。把所有的键放到一个列表里,然后对这个列表进行排序,是最有效的做法;因为列表排序非常快,而以这种方式获取键的列表也是最快的。接下来,你可以创建一个新的值列表,或者像示例那样逐个返回这些值。需要注意的是,如果你在遍历字典的时候,不能修改它(否则下一次遍历会出错),所以如果你想在完成sorted_dict()的结果之前修改字典,最好让它返回一个列表。

9

这样怎么样:

def itersorted(d):
    for key in sorted(d):
        yield d[key]

撰写回答