1

まず、以下のような辞書があるとします。

temp = {'A': 3, 'S': 1}

次のような項目に遭遇した場合、'A': 4次のような辞書に追加されます。

temp = {'A': 4, 'S': 1} 

Aだったキーの以前の値を残します3

第二に、私の辞書が

{'A': 3, 'S': 1} 

またはのような別の項目が辞書に表示された場合にエラーを報告するにはどうすればよいです'A': 4'S': 5

4

4 に答える 4

2

キーが辞書に既に存在するかどうかをテストできます。

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
于 2012-07-26T22:34:20.517 に答える
1

このようなものをお探しですか?

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
于 2012-07-26T22:35:50.493 に答える
1
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
于 2012-07-26T22:38:56.870 に答える
1

これを行う最善の方法は、おそらくキーが既に存在する場合に例外を発生させるためにサブクラス化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
于 2012-07-26T22:39:17.727 に答える