0

これを行う簡単な方法があると確信していますが、私は苦労しています。

フィールド名のリストがあります。例:

fields = ['foo', 'bar', 'baz']

私はこれらの名前のいくつかを使用する(多くの)辞書を持っています:

values = {'foo': 1, 'baz': 2}

私が欲しいのは、この辞書を値のリストに変換し、フィールドリストと一致する正しい場所に配置することです。

value_list = [1, None, 2]

これまでの私の最善の解決策は次のとおりです。

value_list = [values.get(field) for field in fields]

しかし、zipなどを使用するより良い方法はありますか?

特に、「値ディクショナリ」の長いリスト(たとえば、10000)があり、それらがかなりまばらである場合(たとえば、フィールドの長さは200ですが、各「値ディクショナリ」には約10エントリしかありません)、より速い方法?

4

3 に答える 3

2

特に、「値ディクショナリ」の長いリスト(たとえば、10000)があり、それらがかなりまばらである場合(たとえば、フィールドの長さは200ですが、各「値ディクショナリ」には約10エントリしかありません)、より速い方法?

おそらく。

  1. 目的のインデックスにキーをマッピングする辞書を作成します。

    idx = dict((k, i) for i, k in enumerate(fields))
    

    これは前処理ステップであり、辞書のバッチ全体に対して1回だけ実行する必要があります。

  2. 次に、フィールドの代わりに辞書キーをループします。

    lst = [None] * len(fields)
    for k, v in values.iteritems():
        lst[idx[k]] = v
    

これは、フィールドの数があたりのキーの数よりもはるかに多い場合に高速になるはずです。これは、dictハッシュルックアップをスキップし、のトラバーサル中に動的にではなく、一度にリストを作成できるためですfields。(ただし、後者の最適化は、現在のアルゴリズムにも適用できます。)

これを実際のコードに適用する前に、必ずベンチマークを行ってください。実際のパフォーマンスは、ハッシュ関数(したがって実際のキー)の速度や実行する割り当て超過など、多くの要因に依存するためdictです。

于 2013-02-28T17:10:50.203 に答える
0

リストを使い終わったときに何をするかによっては、代わりにジェネレーターを使用することを検討できます。操作が少なくなることはありませんが、不要なリストを作成する手間を省くことができます。

value_iterator = (values.get(field) for field in fields) # Python>=2.7

for value in value_iterator:
    #Do something.

このようにして、値の「リスト」を反復処理するまで、操作は実行されません。

于 2013-02-28T17:17:02.710 に答える
-1

を使用しcollections.Counterます。

import collections as col
cntr = col.Counter(your_list)

次に、次のことができます。

counts = cntr.most_common()

これによりタプルのリストが得られ、これをリスト化して理解することができます。

しかし、コメント者が言及しているように、あなたのソリューションはかなりいいです。

于 2013-02-28T16:49:02.853 に答える