1889

Pythonで辞書から項目を削除する方法はありますか?

さらに、辞書からアイテムを削除してコピーを返すにはどうすればよいですか (つまり、オリジナルを変更しないでください)。

4

18 に答える 18

2233

このdelステートメントは要素を削除します。

del d[key]

これにより既存の辞書が変更されるため、同じインスタンスへの参照を持つ他のユーザーの辞書の内容が変更されることに注意してください。新しい辞書を返すには、辞書のコピーを作成します。

def removekey(d, key):
    r = dict(d)
    del r[key]
    return r

dict()コンストラクターは浅いコピーを作成します。ディープ コピーを作成するには、copyモジュールを参照してください。


すべての dict del/assignment/etc のコピーを作成することに注意してください。一定時間から線形時間に移行し、線形空間も使用することを意味します。小さな辞書の場合、これは問題ではありません。ただし、大きな辞書のコピーを多数作成する予定がある場合は、HAMT のような別のデータ構造が必要になる可能性があります (この回答で説明されています)。

于 2011-04-30T21:25:39.520 に答える
112

私はあなたの解決策がそれを行うための最良の方法だと思います。ただし、別の解決策が必要な場合は、次のように、指定したキーを含めずに、古い辞書のキーを使用して新しい辞書を作成できます。

>>> a
{0: 'zero', 1: 'one', 2: 'two', 3: 'three'}
>>> {i:a[i] for i in a if i!=0}
{1: 'one', 2: 'two', 3: 'three'}
于 2011-04-30T21:26:40.410 に答える
73

del ステートメントは、探しているものです。「bar」というキーを持つ foo という名前の辞書がある場合、次のように foo から「bar」を削除できます。

del foo['bar']

これにより、操作対象の辞書が永続的に変更されることに注意してください。元の辞書を保持したい場合は、事前にコピーを作成する必要があります。

>>> foo = {'bar': 'baz'}
>>> fu = dict(foo)
>>> del foo['bar']
>>> print foo
{}
>>> print fu
{'bar': 'baz'}

呼び出しはdict浅いコピーを作成します。ディープ コピーが必要な場合は、 を使用しますcopy.deepcopy

便宜上、コピーして貼り付けることができる方法を次に示します。

def minus_key(key, dictionary):
    shallow_copy = dict(dictionary)
    del shallow_copy[key]
    return shallow_copy
于 2011-04-30T21:23:36.210 に答える
24
d = {1: 2, '2': 3, 5: 7}
del d[5]
print 'd = ', d

結果:d = {1: 2, '2': 3}

于 2011-04-30T21:24:48.407 に答える
10

いいえ、他に方法はありません

def dictMinus(dct, val):
   copy = dct.copy()
   del copy[val]
   return copy

ただし、わずかに変更された辞書のコピーを作成することは、比較的大きなメモリ需要をもたらすため、おそらく良い考えではありません。通常は、古い辞書を(必要な場合でも)ログに記録してから変更することをお勧めします。

于 2011-04-30T21:27:32.133 に答える
6
>>> def delete_key(dict, key):
...     del dict[key]
...     return dict
... 
>>> test_dict = {'one': 1, 'two' : 2}
>>> print delete_key(test_dict, 'two')
{'one': 1}
>>>

これはエラー処理を行いません。キーがdictにあると想定します。最初にそれを確認し、raiseそうでない場合は確認することをお勧めします。

于 2011-04-30T21:26:25.287 に答える
2
    species = {'HI': {'1': (1215.671, 0.41600000000000004),
  '10': (919.351, 0.0012),
  '1025': (1025.722, 0.0791),
  '11': (918.129, 0.0009199999999999999),
  '12': (917.181, 0.000723),
  '1215': (1215.671, 0.41600000000000004),
  '13': (916.429, 0.0005769999999999999),
  '14': (915.824, 0.000468),
  '15': (915.329, 0.00038500000000000003),
 'CII': {'1036': (1036.3367, 0.11900000000000001), '1334': (1334.532, 0.129)}}

次のコードは、辞書のコピーを作成し、species含まれていないアイテムを削除しますtrans_HI

trans_HI=['1025','1215']
for transition in species['HI'].copy().keys():
    if transition not in trans_HI:
        species['HI'].pop(transition)
于 2019-08-07T17:13:47.670 に答える