まず、以下のような辞書があるとします。
temp = {'A': 3, 'S': 1}
次のような項目に遭遇した場合、'A': 4
次のような辞書に追加されます。
temp = {'A': 4, 'S': 1}
A
だったキーの以前の値を残します3
第二に、私の辞書が
{'A': 3, 'S': 1}
またはのような別の項目が辞書に表示された場合にエラーを報告するにはどうすればよいです'A': 4
か'S': 5
まず、以下のような辞書があるとします。
temp = {'A': 3, 'S': 1}
次のような項目に遭遇した場合、'A': 4
次のような辞書に追加されます。
temp = {'A': 4, 'S': 1}
A
だったキーの以前の値を残します3
第二に、私の辞書が
{'A': 3, 'S': 1}
またはのような別の項目が辞書に表示された場合にエラーを報告するにはどうすればよいです'A': 4
か'S': 5
キーが辞書に既に存在するかどうかをテストできます。
if 'A' in temp:
# report the error
2 つの辞書をマージする場合、それらからセットを作成し、共通部分が空であることを確認することで、キーが重複しているかどうかをテストできます。
if set(temp.keys()).intersection(set(other.keys())):
# report the error
同じ値である限り重複したキーを使用しても問題ない場合は、上記を単純に変更するだけで取得できます。
if 'A' in temp and temp['A'] != 4:
# can't insert the new value 'A': 4
if [True for x in set(temp.keys()).intersection(set(other.keys())) if temp[x] != other[x]]:
# at least one value in temp doesn't match a value in other
このようなものをお探しですか?
temp = {
'A': 3
'S' : 1
}
def insert_or_raise(k, v) {
global temp # assuming temp is global and accessible
val = temp.get(k, None)
if not val:
temp[k] = v
return
if v != val:
raise Error("values are not same , already inserted %s for key %s " % (val, k))
}
insert('B', 1) # inserts okay
insert('B', 1) # does nothing, same key, value pair exists
insert('B', 2) # raise Error value is not 1 for key B
def strictInsert( existingDict, key, value ):
# check to see if the key is present
if key in existingDict:
# assuming you only want an error if the new value is
# different from the old one...
if existingDict[key] != value:
# raise an error
raise ValueError( "Key '%s' already in dict"%key )
else:
# insert into the dict
existingDict[key] = value
temp = {'A': 3, 'S': 1}
strictInsert( temp, 'A', 4 )
これにより、次の結果が得られます。
Traceback (most recent call last):
File "so.py", line 15, in <module>
strictInsert( temp, 'A', 4 )
File "so.py", line 8, in strictInsert
raise ValueError( "Key '%s' already in dict"%key )
ValueError: Key 'A' already in dict
これを行う最善の方法は、おそらくキーが既に存在する場合に例外を発生させるためにサブクラス化dict
およびオーバーライドすることです。__setitem__()
誰かが既存の追記型辞書collections
か何かを知らない限り...
class WriteOnceDict(dict):
def __setitem__(self, key, value):
try:
retrieved_value = self[key]
except KeyError:
super(WriteOnceDict, self).__setitem__(key, value)
if retrieved_value != value:
raise KeyError('Different value already added for %s.' % key)
mydict = WriteOnceDict()
for key, value in input_data: #or appropriate code for whatever your input data is
mydict[key] = value