2016-12-04 13 views
-1

にソート適用するので、Pythonドキュメントは、複雑なデータ型にsortedを適用するときにoperatorモジュールからitemgetterattrgetter、またはmethodgetterを使用することを提案しています。さらに、iteratorsは、大きいサイズのオブジェクトのリストより小さく、速くなります。のPython 3.5 OrderedDict:ネストされた辞書のイテレータ

したがって、OrderDictiteratorを作成する方法が不思議です。その理由は、私がすべての値を並べ替えることを望むのは、(規則的な)辞書でもあるからです。通常の辞書用

、一つはでこれを行うことができます。しかし

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

OrderedDictのみOrderedDictキー上で動作する方法__iter__()を持っているようです。

OrderedDictの値のイテレータを効率的に作成するにはどうすればよいですか。

リストの理解度、ラムダ関数、または関連するサブキー(辞書内のキー(値))を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の場合、 'dict.values()'は* iterableであるため、 'itervalues()'は必要ありません。 Python 3では、 'dict.itervalues()' *は存在しません*。 –

+0

@MartijnPieters 'OrderedDict.values'は' class odict_values'型です – SumNeuron

+0

あなたはOrderedDictのサンプルを持っていますか? – user312016

答えて

1

答えはviewを取得し、iterに設定入力する方法.values()を呼び出すことです:

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

iterを呼び出すことは過剰です。 'sorted()'はすでに行います。 –

2

dictOrderedDictitervalues()を持っているどちらもこのメソッドは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コードよりもはるかに高速です。

関連する問題