的Python 3.5 OrderedDict:将分类到嵌套字典迭代
所以蟒文档建议上复杂的数据类型施加sorted
在使用itemgetter
,attrgetter
,或methodgetter
从operator
模块。此外,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}
})
答案是调用该方法.values()
获得view
和类型设置为iter
:
sorted(iter(my_dict.values()), key=itemgetter('my_subkey'))
调用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代码执行得更快。
如果这真的是Python 3,那么您不需要'itervalues()',因为'dict.values()'已经*是可迭代的了。在Python 3中,'dict.itervalues()'*不存在*。 –
@MartijnPieters'OrderedDict.values'类型为'class odict_values' – SumNeuron
你有OrderedDict的例子吗? – user312016