0

私は辞書を持っていdict1ます; 各値は文字列のリストです。この文字列リストのすべての要素にが含まれている場合'my_string'、この特定のキーは必要ありません。私はこれを思いついた:

from collections import defaultdict
dict2 = defaultdict(list)
for key, value in dict1.iteritems():
    for list_element in value:
        if 'my_string' not in list_element:
            dict2[key] = dict1[key]

それは機能しますが、それを行うためのより良い方法があると確信しています。(そして、上記のコードで発生する別の辞書を作成したくないのですが、それはそれほど重要ではありません。)

4

3 に答える 3

2
for key, value in dict1.items():
    if all('my_string' in e for e in value):
        del dict1[key]

iteritems注:同じdictを使用および削除しないように注意してください。items大丈夫です、それはコピーを作ります。

于 2012-12-29T00:23:52.743 に答える
2

dict繰り返しながら変更することはできません。古いものをフィルタリングして新しいものを作成するかdict、反復するために何らかの一時オブジェクトを作成する必要があります。

(1)dictフィルタリングされた結果を使用して新しいものを作成します。

dict1 = {k:v for (k, v) in dict1.iteritems() if all('my_string' in e for e in v)}

(2.1)一時的なものを作成しますdict

for k, v in dict1.copy():
    if all('my_string' in e for e in v):
        del dict1[k]

(2.2)listKey-Valuetupleの一時的なものを作成します。

for k, v in dict1.items():
    if all('my_string' in e for e in v):
        del dict1[k]

list(2.3)キーの一時を作成します。

for k in dict1.keys():
    if all('my_string' in e for e in dict1[k]):
        del dict1[k]

それで、どのようにそれらの間で決定しますか?

1は、ミューテーションのないコードのすべての利点を備えているため、最も簡単に推論できます。しかし、2.1-2.3は、初心者プログラマーにとってはおそらくもっと簡単です。通常、その区別が最も重要です。

メモリ使用量が心配な場合は、2.3が2.1-2.2よりも優れていることは明らかです。これは、一時オブジェクトがはるかに小さいためです。しかし、2.3対1はどうですか?それは2つのことに依存します:最初に、残りのアイテムだけlistと比較して、すべてのキーの大きさはどれくらいですか?dict次に、大きなハッシュテーブルを縮小するのではなく、小さなハッシュテーブルを最初から作成することで、どのくらいのスペースが得られますか?Pythonはハッシュテーブルをまったく縮小しないため、通常、後者のメリットはありません…しかし、それが重要な場合は、プラットフォームでユースケースをテストして、何が起こるかを確認する必要があります。

パフォーマンスが心配な場合は、メモリ使用量とよく似ています。2.3対1は明らかな競争相手であり、ほとんどの状況を維持しない限り1の方が優れていますがdict、重要な場合は、自分で測定する必要があります。

最後に、上記はPython 2.7の場合であり、これは(推測として)使用しているように見えるものであることに注意してください。3.xではitemskeys両方とも既存のイテレータを返すため、コピーを明示的に行うdict必要があります。list(dict1.items())list(dict1.keys())

于 2012-12-29T00:31:57.150 に答える
1

お使いのバージョンで利用可能な場合は、辞書の理解を使用できると思います。

filtered = {k:v for k,v in d1.items() if all(e == 'my_string' for e in v)}

これは、最初の辞書のフィルタリングされたコピーである2番目の辞書を作成してもかまわないことを前提としています。

于 2012-12-29T01:03:03.200 に答える