2017-02-18 8 views
1

私はlistの繰り返しをdictとしています。私は各dictのいくつかの要素を除外したいと思います。私はlist全体をループすることでこれを行うことができ、下の例に示すように、必要な要素を選択します。しかし、これは効率的な方法のようには見えません。以下に出力されるように、メモリ使用量と速度に関して望ましい結果を達成する最良の方法は何ですか?繰り返しキーと異なる値を持つ辞書のリストから要素を除外するにはどうすればいいですか?

listOfDic = [ 
     {'firstElement': 'a', 'secondElement': '1', 'thirdElement': 'i'} 
    , {'firstElement': 'b', 'secondElement': '2', 'thirdElement': 'ii'} 
    , {'firstElement': 'c', 'secondElement': '3', 'thirdElement': 'iii'} 
] 
filteredListOfDic = [] 

# looping through old list, selecting first and third element 
# and using those elements for building a new "filtered" list of dict 
for row in listOfDic: 
    filteredListOfDic.append({ 
      'firstElement': row['firstElement'] 
     , 'thirdElement': row['thirdElement'] 
    }) 

print filteredListOfDic 

結果ビーイング:

[{'thirdElement': 'i', 'firstElement': 'a'} 
, {'thirdElement': 'ii', 'firstElement': 'b'} 
, {'thirdElement': 'iii', 'firstElement': 'c'}] 
+0

メモリに関しては、2つの要素を持つ辞書のリストでなければなりません。より良いメモリ使用を達成するためのアプローチはありません。スピードという言葉は、すべての要素を通過して必要なものを選択する必要がありますが、とにかく_O(n)_ですが、パフォーマンスが少し改善されたアプローチが必要です。 – Arman

答えて

2

Iは、単純なdelはなく、所望の要素をコピーする、各辞書から要素を削除するのに十分であろうと思います。

for l in listOfDic: 
    del l["secondElement"] 

>>> print listOfDic 
>>> [{'thirdElement': 'i', 'firstElement': 'a'}, {'thirdElement': 'ii', 'firstElement': 'b'}, {'thirdElement': 'iii', 'firstElement': 'c'}] 
+1

はいくつかのベンチマークを行い、私が見る限り、削除は最も速い方法です。元の 'dict'を保持しなければならない場合は、@zwerからの素晴らしい選択肢です。 @zwerと@JonClementsのメソッドも使用するテストを作成しました。 1.000.000ループを実行したときの結果は、 - '元のメソッド:1.43119890333s' - ' list comprehension a:1.24798784415s' - 'list comprehension b:1.93964952847s - ' delete:0.71917023139'' – klevstul

+0

注:リストの理解を伴う削除をベンチマークするために、2つのリストの理解方法をベンチマークするだけのテストと比較してテストが変更されました。したがって、以下の数字とは異なる数字になります。 – klevstul

1

あなたの辞書を維持する必要がある場合は、単純なリストの内包表記を使用して新しいものを作成することができます。

filteredListOfDic = [{"firstElement": row["firstElement"], "thirdElement": row['thirdElement']} for row in listOfDic] 

EDIT:パフォーマンスの向上の不審な人のためにリストの内包表記を使用して:

#time: original_method() - 1,000,000 loops: 1.10493s 
#time: lst_comp_method() - 1,000,000 loops: 0.79917s 

これは、ほぼ40%高速です。

+0

キーの名前を1つの場所に置き、必要なものを取り除いて、 '{{{k:d [k]( 'firstElement'、 'thirdElement')} for d in listOfDic]'キー/値ごとに繰り返します。 –

+0

@JonClements - 私はそのアイデアを気にしていましたが、読みやすく(そして制御しやすい)一方、約10倍も遅くなりました(各要素の追加ループ+タプル作成)。 OPの主な関心事はメモリ使用量とスピードであることを考えると、素敵なダイナミックソリューションは本当に答えではありません;) – zwer

+0

ありがとう!素敵な入力。私はいくつかのより多くのタイミングテストを続けました。 1.000.000ループを実行したときの結果を示します: 'original_method:0.935705815317s' - ' lst_comp_method:0.750181842205s'と '2nd_comp_method:1.40672337193s' – klevstul

関連する問題