辞書からキーを削除しようとするとき、私は書きます:
if 'key' in myDict:
del myDict['key']
これを行うための1行の方法はありますか?
dict.pop()
:を使用してください。
my_dict.pop('key', None)
key
が辞書に存在すればmy_dict[key]
を、そうでなければNone
を返します。 2番目のパラメータが指定されておらず(my_dict.pop('key')
)、key
が存在しない場合、KeyError
が発生します。
具体的には、「これを行う1行の方法はありますか?」
if 'key' in myDict: del myDict['key']
...まあ、あなたに尋ねた;-)
ただし、dict
からオブジェクトを削除するこの方法は アトミックではない であるため、'key'
がmyDict
に含まれている可能性がif
ステートメント。ただし、del
が実行される前に削除できます。その場合、del
はKeyError
で失敗します。これを考えると、 se dict.pop
または次の行に沿ったもののいずれかが最も安全です。
try:
del myDict['key']
except KeyError:
pass
もちろん、これは間違いなく1行ではありません。
my_dict.pop("key", None)
が正確に何をしているのかを理解するのに少し時間がかかりました。だから私は他のグーグルの時間を節約するための答えとしてこれを追加します。
pop(key [、default])
Keyが辞書にある場合はそれを削除してその値を返し、そうでなければdefaultを返します。 defaultが与えられておらずkeyが辞書にない場合はKeyErrorが送出されます。
上記の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
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'はエラーになりませんでした。
つかいます:
>>> if myDict.get(key): myDict.pop(key)
別の方法:
>>> {k:v for k, v in myDict.items() if k != 'key'}
条件により削除できます。 key
が存在しなくてもエラーにはなりません。
"del"キーワードを使う:
del dict[key]
以下の方法で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}
del
とpop
の違いは、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 これが役に立つと思われる場合は、今後の参考にしてください。
不変バージョンが好き
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}
非常に冗長にしたい場合は、例外処理を使用できます。
try:
del dict[key]
except KeyError: pass
ただし、キーが存在しない場合、これはpop()
メソッドよりも遅くなります。
my_dict.pop('key', None)
いくつかのキーで問題になることはありませんが、これを繰り返している場合は、後者の方法が適しています。
最速のアプローチはこれです:
if 'key' in dict:
del myDict['key']
しかし、2行の間で'key'
が削除されると、KeyError
が発生するため、この方法は危険です。