webdevqa.jp.net

Python辞書からキーを削除する方法

辞書からキーを削除しようとするとき、私は書きます:

if 'key' in myDict:
    del myDict['key']

これを行うための1行の方法はありますか?

1340
Tony

dict.pop() :を使用してください。

my_dict.pop('key', None)

keyが辞書に存在すればmy_dict[key]を、そうでなければNoneを返します。 2番目のパラメータが指定されておらず(my_dict.pop('key'))、keyが存在しない場合、KeyErrorが発生します。

2211
Sven Marnach

具体的には、「これを行う1行の方法はありますか?」

if 'key' in myDict: del myDict['key']

...まあ、あなたに尋ねた;-)

ただし、dictからオブジェクトを削除するこの方法は アトミックではない であるため、'key'myDictに含まれている可能性がifステートメント。ただし、delが実行される前に削除できます。その場合、delKeyErrorで失敗します。これを考えると、 se dict.pop または次の行に沿ったもののいずれかが最も安全です。

try:
    del myDict['key']
except KeyError:
    pass

もちろん、これは間違いなく1行ではありません

323
zigg

my_dict.pop("key", None)が正確に何をしているのかを理解するのに少し時間がかかりました。だから私は他のグーグルの時間を節約するための答えとしてこれを追加します。

pop(key [、default])

Keyが辞書にある場合はそれを削除してその値を返し、そうでなければdefaultを返します。 defaultが与えられておらずkeyが辞書にない場合はKeyErrorが送出されます。

ドキュメンテーション

126
Akavall

上記の3つの解決策のタイミング。

delはPythonの辞書からキーを削除するための最も速い方法です

小さな辞書

>>> import timeit
>>> timeit.timeit("d={'a':1}; d.pop('a')")
0.23399464370632472
>>> timeit.timeit("d={'a':1}; del d['a']")
0.15225347193388927
>>> timeit.timeit("d={'a':1}; d2 = {key: val for key, val in d.items() if key != 'a'}")
0.5365207354998063

大きい辞書:

>>> timeit.timeit("d={nr: nr for nr in range(100)}; d.pop(3)")
5.478138627299643
>>> timeit.timeit("d={nr: nr for nr in range(100)}; del d[3]")
5.362219126590048
>>> timeit.timeit("d={nr: nr for nr in range(100)}; d2 = {key: val for key, val in d.items() if key != 3}")
13.93129749387532
35
Peter Smit

1行のコードで辞書から多くのキーを削除する必要がある場合は、map()を使用するのが非常に簡潔でPythonicが読めると思います。

myDict = {'a':1,'b':2,'c':3,'d':4}
map(myDict.pop, ['a','c']) # The list of keys to remove
>>> myDict
{'b': 2, 'd': 4}

また、辞書にない値をポップしたときにエラーを検出する必要がある場合は、map()の内側で次のようにlambdaを使用します。

map(lambda x: myDict.pop(x,None), ['a', 'c', 'e'])
[1, 3, None] # pop returns
>>> myDict
{'b': 2, 'd': 4}

またはpython3では、代わりにリスト内包表記を使用する必要があります。

[myDict.pop(x, None) for x in ['a', 'c', 'e']]

できます。 myDictに 'e'キーがなくても、 'e'はエラーになりませんでした。

30
Marc Maxmeister

つかいます:

>>> if myDict.get(key): myDict.pop(key)

別の方法:

>>> {k:v for k, v in myDict.items() if k != 'key'}

条件により削除できます。 keyが存在しなくてもエラーにはなりません。

16
Shameem

"del"キーワードを使う:

del dict[key]
12
Sarthak Gupta

以下の方法でPython辞書からキーを削除することができます。

delキーワードを使用する。それはあなたがしたのとほぼ同じアプローチです -

 myDict = {'one': 100, 'two': 200, 'three': 300 }
 print(myDict)  # {'one': 100, 'two': 200, 'three': 300}
 if myDict.get('one') : del myDict['one']
 print(myDict)  # {'two': 200, 'three': 300}

または

次のようにします。

しかし、このプロセスでは実際にはその辞書から特定のキーを exclude にするのではなく、そのキーを delete にしないということを覚えておいてください。さらに、私はそれがmyDictと同じ順序ではない辞書を返すことを観察しました。

myDict = {'one': 100, 'two': 200, 'three': 300, 'four': 400, 'five': 500}
{key:value for key, value in myDict.items() if key != 'one'}

シェルで実行すると、{'five': 500, 'four': 400, 'three': 300, 'two': 200}のように実行されます - myDictと同じ順序ではないことに注意してください。 myDictを印刷しようとすると、このアプローチで辞書から除外したものも含めて、すべてのキーを見ることができます。しかし、次のステートメントを変数に代入することで新しい辞書を作ることができます。

var = {key:value for key, value in myDict.items() if key != 'one'}

印刷しようとすると、親の順序に従います。

print(var) # {'two': 200, 'three': 300, 'four': 400, 'five': 500}

または

pop()メソッドを使う.

myDict = {'one': 100, 'two': 200, 'three': 300}
print(myDict)

if myDict.get('one') : myDict.pop('one')
print(myDict)  # {'two': 200, 'three': 300}

delpopの違いは、pop()メソッドを使用すると、必要に応じて キーの値 を実際に格納できることです。

myDict = {'one': 100, 'two': 200, 'three': 300}
if myDict.get('one') : var = myDict.pop('one')
print(myDict) # {'two': 200, 'three': 300}
print(var)    # 100

Fork this これが役に立つと思われる場合は、今後の参考にしてください。

7
iNet

不変バージョンが好き

foo = {
    1:1,
    2:2,
    3:3
}
removeKeys = [1,2]
def woKeys(dct, keyIter):
    return {
        k:v
        for k,v in dct.items() if k not in keyIter
    }

>>> print(woKeys(foo, removeKeys))
{3: 3}
>>> print(foo)
{1: 1, 2: 2, 3: 3}
1
CervEd

非常に冗長にしたい場合は、例外処理を使用できます。

try: 
    del dict[key]

except KeyError: pass

ただし、キーが存在しない場合、これはpop()メソッドよりも遅くなります。

my_dict.pop('key', None)

いくつかのキーで問題になることはありませんが、これを繰り返している場合は、後者の方法が適しています。

最速のアプローチはこれです:

if 'key' in dict: 
    del myDict['key']

しかし、2行の間で'key'が削除されると、KeyErrorが発生するため、この方法は危険です。

0
Alec Alameddine