Python 3.5 OrderedDict:将排序应用于嵌套字典迭代器



因此,python文档建议在对复杂数据类型应用sorted时,使用operator模块中的itemgetterattrgettermethodgetter。此外,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}
})

dictOrderedDict都没有 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'))

最新更新