2016-12-04 97 views
-1

所以蟒文檔建議上覆雜的數據類型施加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

回答

1

答案是調用該方法.values()獲得view和類型設置爲iter

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

調用iter是矯枉過正。 'sorted()'已經會。 –

2

既不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代碼執行得更快。