的Python 3.5 OrderedDict:将分类到嵌套字典迭代

问题描述:

所以蟒文档建议上复杂的数据类型施加sorted在使用itemgetterattrgetter,或methodgetteroperator模块。此外,iterators比大型对象的列表更小且更快。的Python 3.5 OrderedDict:将分类到嵌套字典迭代

因此,我想知道如何在OrderDict上创建iterator。原因是在OrderDict我想排序所有的值也是(普通)字典。

对于普通的字典,我们可以跟着这样做:

sorted(my_dict.itervalues(), key=itemgetter('my_key')) 

然而OrderedDict仅似乎有方法__iter__()这对OrderedDict键的作用。

那么我怎样才能有效地为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} 
        }) 
+1

如果这真的是Python 3,那么您不需要'itervalues()',因为'dict.values()'已经*是可迭代的了。在Python 3中,'dict.itervalues()'*不存在*。 –

+0

@MartijnPieters'OrderedDict.values'类型为'class odict_values' – SumNeuron

+0

你有OrderedDict的例子吗? – user312016

答案是调用该方法.values()获得view和类型设置为iter

sorted(iter(my_dict.values()), key=itemgetter('my_subkey')) 
+0

调用iter是矫枉过正。 'sorted()'已经会。 –

既不dict也不OrderedDict具有itervalues()方法。该方法仅在Python 2中存在。

使用dict.values()

sorted(my_dict.values(), key=itemgetter('my_key')) 

在Python 2要使用itervalues()没有这么多,因为它是一个迭代器,但由于dict.values()必须创造,然后再弃一个新的列表对象。 Iterables也不是更快(相反,它们往往更慢!),它们更具有内存效率。在这种情况下,它更快,因为不必创建一个(大)列表,然后再丢弃需要时间。

在Python 3 dict.values()创建视图代替,一个轻量级对象,dict.itervalues()按需产生值并不必产生一个列表前面。

您不必致电iter()就可以了。 sorted()需要一个可迭代,并且它自己会调用iter()。因为它从本机代码执行此操作,并且不必查找全局名称,所以它可以比Python代码执行得更快。