1

これを行うことにより、辞書のリストからすべての値(特定のキーに対応するものを除く)を取得しようとしています:

fv = [[v for (k,v) in d.iteritems() if k is not 'xKey'] for d in someDict] 

どこsomeDictに似ています:

[{xKey:0.1,yKey:0.2,zKey:0.3},{yKey:0.9,xKey:0.7,zKey:0.4}...]

辞書には固有の順序がないことを知っています。しかし、私のリスト fv のリストは順番に値を持つ必要があります。キーでdictをソートしてから、今行ったことを実行することを考えています。しかし、それは動作することが保証されていますか?

使用がオプションであることは知ってOrderedDictいますが、辞書には通常大量のデータが含まれるため、dict と比較してパフォーマンスが劣っているように見えます。

更新: 順番に値が必要だと言うとき、実際に並べ替える必要はありません。つまり、値のリストを毎回決まった決定論的順序で取得できる必要があるということです。上記の例では、私は常に [[0.2,0.3],[0.9,0.4]] を取得したいのですが、それ自体はソートされた順序ではない場合があります。並べ替えは 1 つの決定論的な順序を強制します。私が本当に気にかけているのは、最終的なリストで値の位置を維持することです。たとえば、yKey の値は常に各リストの最初の値でなければならず、zKey の値は常に各リストの 2 番目の値でなければなりません。 ykey、zkey などは辞書内の任意の順序である場合でも同様です。

4

2 に答える 2

3

辞書に含まれている可能性のあるキーのリストがわかっている場合は、次の解決策が役立つ場合があります。

allkeys = ...  # might be known; or obtained from available dicts by union;
               # 'xKey' can be removed at this stage to simplify the list
               # comprehension that follows
sortedKeys = sorted(allKeys)
list_of_values = [[d.get(k) for k in sortedKeys if k in d]
                                                   for d in list_of_dicts] 

それよりも遅いかもしれませんiteritems。すべての辞書に同じキーのセットが含まれている場合、そのif k in d部分を削除できます。

于 2012-02-09T21:47:22.133 に答える
2

いつものドリルはこれ。

  1. dict として辞書を作成します。速度は優れています。

  2. まれに、次の 2 つのいずれかを実行するためにキーが必要になる場合があります。

    • 全体を OrderedDict に変換する

    • キーを並べ替えます。 for k in sorted( some_dict.keys() ):

    選択は、ソートコストの償却の 1 つです。1 つのことをしている場合は、並べ替えます。いくつかのことをしている場合は、OrderedDict を作成します。

  3. 値が何らかの順序である必要がある、非常にまれなケースでは、これを行います。

    ordered_values = list( sorted( some_dictionary.values() ) )
    
于 2012-02-09T21:33:51.357 に答える