因此,python文档建议在对复杂数据类型应用sorted
时,使用operator
模块中的itemgetter
、attrgetter
或methodgetter
。此外,iterators
比大尺寸对象的列表更小、更快。
因此,我想知道如何在OrderDict
的值上创建一个iterator
。原因是在OrderDict
中,我希望对所有值进行排序也是(常规)字典。
对于常规词典,可以使用以下内容:
sorted(my_dict.itervalues(), key=itemgetter('my_key'))
但是OrderedDict
似乎只有适用于OrderedDict
键的方法__iter__()
。
那么我怎样才能有效地为OrderedDict
的值制作迭代器。
请注意,我不是在寻找列表理解、lambda 函数或提取OrderedDict
的相关子键(字典内的键(值))值。
例如
sorted (my_dict, key= lambda key: my_dict[key]['my_key'])
示例嵌套:
test = OrderedDict({'a': {'x':1, 'y':2, 'z':3},
'b': {'x':1, 'y':2, 'z':3}
})
dict
和OrderedDict
都没有 Python 3 中的itervalues()
方法。该方法仅存在于Python 2中。
使用dict.values()
:
sorted(my_dict.values(), key=itemgetter('my_key'))
在 Python 2 中,你想使用itervalues()
不是因为它是一个迭代器,而是因为dict.values()
必须创建一个新的列表对象,然后再次丢弃。可迭代对象也不是更快(相反,它们通常更慢!),相反,它们的内存效率更高。在这种情况下,它更快,因为不必创建(大)列表,然后再次丢弃需要时间。
在 Python 3 中,dict.values()
创建了一个视图,这是一个轻量级对象,它像dict.itervalues()
一样按需生成值,而不必预先生成列表。
您不必为此致电iter()
。sorted()
需要一个可迭代对象,并且本身会调用iter()
你传入的任何内容。因为它从本机代码中执行此操作,并且不必查找全局名称,所以它可以比 Python 代码更快地执行此操作。
答案是调用方法.values()
获取view
并将其键入设置为iter
:
sorted(iter(my_dict.values()), key=itemgetter('my_subkey'))