この記事では、Python の辞書からキーを削除する方法について見ていきます。これは pop()
関数、 del
キーワード、そして dict内包を用いて行うことができます。
pop(key,d)を使ってキーを削除する。
関数 pop(key, d)
は、辞書からキーを削除し、その値を返します。引数は2つで、削除するキーと、そのキーが見つからなかった場合に返すオプションの値です。以下は、必要な引数 key
だけを指定して要素をポップする例です。
my_dict = {1: "a", 2: "b"}
popped_value = my_dict.pop(1)
line = "The value removed from the dictionary of the key: 1 is {}"
print(line.format(popped_value))
このスニペットは次のような出力を返します。
The value removed from the dictionary of the key: 1 is a
さて、存在しないキーを削除しようとするとどうなるか、観察してみましょう。
my_dict = {1: "a", 2: "b"}
popped_value = my_dict.pop(3)
line = "The value removed from the dictionary of the key: 3 is {}"
print(line.format(popped_value))
これは、存在しないので、予想通りKeyErrorを発生させます。
Traceback (most recent call last):
File "<stdin", line 1, in <module
KeyError: 3
存在しないキーに対して pop()
を呼び出すと、Python は KeyError
を返します。ですから、 pop(key)
は、そのキーが辞書に存在すると確信している場合にのみ使用してください。
もし、キーが存在するかどうかわからない場合は、 pop()
のオプションの2番目の引数に値を指定します – デフォルト値です。KeyErrorを投げる代わりに、その値を返します。
上記のスニペットは次のように書き換えることができます。
my_dict = {1: "a", 2: "b"}
removed_value = my_dict.pop(3, None)
line = "The value removed from the dictionary of the key: 3 is {}"
print(line.format(removed_value))
これで、実行してもエラーになりません。
The value removed from the dictionary of the key: 3 is None
del dict[key]を使ってキーを削除する
辞書からキーを削除するもう一つの方法は、 del
キーワードを使うことです。このキーワードはあらゆるオブジェクトを削除することができます。また、以下のように、辞書のキーと値のペアを削除することもできます。del dict_name[key]`:
my_dict = {1: "a", 2: "b"}
del my_dict[1]
line = "The dictionary after deletion is {}"
print(line.format(my_dict))
上のスニペットは次のような出力を返し、辞書から値を削除したことを示します。
The dictionary after deletion is {2: 'b'}
pop()`とは異なり、削除されても値は返されません。もし、既存の辞書の入力を保持したい場合は、次のセクションが参考になるでしょう。
Dict Comprehension で複数の辞書キーを削除する
前述のメソッドは、辞書をインプレースで更新します。つまり、キーと値のペアが破棄されることを意味します。元のキーを保持する必要がある場合は、カスタム関数を使用してそれを行うことができます。Pythonでは、リスト内包を使って既存のリストを元に新しいリストを作ることが一般的に知られています。同じことをディクショナリで行うには、ディクショナリ内包を使います。
つまり、リストの値を削除する代わりに、dict内包を使って、不要な値を除外した条件で新しい辞書を作成することができます。
次の例では、1
のキーを持たない新しい辞書を作成します。
my_dict = {1: "a", 2: "b"}
my_dict2 = {k: v for k, v in my_dict.items() if k != 1}
line = "The new dictionary is {}"
print(line.format(my_dict2))
このスニペットは次のような出力を生成し、新しい辞書を表示します。
The new dictionary is {2: 'b'}
新しい辞書を作成しているため、プログラムのメモリ使用量が増えていることに注意してください。大きなサイズの辞書の場合、多くのメンバーを除外しなければ、そのデータのために使用されるメモリはほぼ2倍になります。
ベンチマーク機能効率
ここまでで3つの方法を観察した。しかし、3つのうちどの方法が一番速いのだろうか?
それでは、このメソッドを試すためにランダムな辞書を作ってみましょう。以下の関数 gen_random_dict(n)
はリストを引数にとり、ランダムな整数のシードを持つ辞書を作成する。
import random
def gen_random_dict(n):
random.seed(0)
mydict = {}
for i in range(n):
nmbr = random.randrange(1, n, 1)
mydict[nmbr] = "value "+ str(nmbr)
return mydict
この同じファイルに、これまで説明したような方法でキーを削除する関数をいくつか追加してみましょう。
# Remove a key using pop function
def remove_using_pop(dict_input):
dict_input.pop(1)
return None
# Remove a key using del keyword
def remove_using_del(dict_input):
del dict_input[1]
return None
# Remove a key using condition
def remove_using_condition(dict_input):
return {k: v for k, v in dict_input.items() if k != 1}
最後に、コードの実行時間を測定する timeit
モジュールを使用する次のコードを追加します。
import timeit
if __name__ == "__main__":
func_to_be_tested = "remove_using_pop(gen_random_dict(10000))"
setup_stmt = "from __main__ import remove_using_pop, gen_random_dict"
runtime1 = timeit.timeit(func_to_be_tested, setup=setup_stmt, number=1)
func_to_be_tested = "remove_using_del(gen_random_dict(10000))"
setup_stmt = "from __main__ import remove_using_del, gen_random_dict"
runtime2 = timeit.timeit(func_to_be_tested, setup=setup_stmt, number=1)
func_to_be_tested = "remove_using_condition(gen_random_dict(10000))"
setup_stmt = "from __main__ import remove_using_condition, gen_random_dict"
runtime3 = timeit.timeit(func_to_be_tested, setup=setup_stmt, number=1)
print("Runtime for removing key from Dict:")
print(" 1) Using Pop: {}".format(str(runtime1)))
print(" 2) Using Del: {}".format(str(runtime2)))
print(" 3) Using Condition: {}".format(str(runtime3)))
結果はあなたのコンピュータによって異なるかもしれませんが、パターンは一貫しているはずです。このスクリプトを実行した後の出力は以下のとおりです。
Runtime for removing key from Dict:
1) Using Pop: 0.015606499999194057
2) Using Del: 0.01090950000070734
3) Using Condition: 0.011443700001109391
del`キーワードは他の方法より優れています。しかし、小さな辞書ではそれほど劇的な時間差はないようです。しかし、辞書のサイズが大きくなると、大きな影響を与えるだろう。
結論
この記事では、キーと値のペアを辞書から削除する方法として、 pop()
, del
, dict comprehensions の3つを学びました。辞書のサイズに合わせて適切な方法を選択することで、スクリプトの実行時間やメモリ使用量を減らすことができます。
</module