Python字典添加,删除,查询等相关操作方法详解
1、实现代码
#创建 stu_info={"xiedi":28,"liuhailin":27,"daiqiao":30,"hanwenhai":25,"chenqun":38} print(stu_info) #增加 stu_info["luoahong"]=32 print(stu_info) #修改 stu_info["xiedi"]=29 print(stu_info)
输出结果
{'xiedi':28,'liuhailin':27,'daiqiao':30,'hanwenhai':25,'chenqun':38} {'xiedi':28,'liuhailin':27,'daiqiao':30,'hanwenhai':25,'chenqun':38,'luoahong':32} {'xiedi':29,'liuhailin':27,'daiqiao':30,'hanwenhai':25,'chenqun':38,'luoahong':32}
1、实现代码
delstu_info["chenqun"] print(stu_info)
2、输出结果
{'xiedi':29,'liuhailin':27,'daiqiao':30,'hanwenhai':25,'luoahong':32}
1、Dict_DelItem
int PyDict_DelItem(PyObject*op,PyObject*key) { Py_hash_thash; assert(key); if(!PyUnicode_CheckExact(key)|| (hash=((PyASCIIObject*)key)->hash)==-1){ hash=PyObject_Hash(key); if(hash==-1) return-1; } return_PyDict_DelItem_KnownHash(op,key,hash); }
2、Dict_DelItem_KnownHash
int _PyDict_DelItem_KnownHash(PyObject*op,PyObject*key,Py_hash_thash) { Py_ssize_tix; PyDictObject*mp; PyObject*old_value; if(!PyDict_Check(op)){ PyErr_BadInternalCall(); return-1; } assert(key); assert(hash!=-1); mp=(PyDictObject*)op; ix=(mp->ma_keys->dk_lookup)(mp,key,hash,&old_value); if(ix==DKIX_ERROR) return-1; if(ix==DKIX_EMPTY||old_value==NULL){ _PyErr_SetKeyError(key); return-1; } //Splittabledoesn'tallowdeletion.Combineit. if(_PyDict_HasSplitTable(mp)){ if(dictresize(mp,DK_SIZE(mp->ma_keys))){ return-1; } ix=(mp->ma_keys->dk_lookup)(mp,key,hash,&old_value); assert(ix>=0); } returndelitem_common(mp,hash,ix,old_value); } /*Thisfunctionpromisesthatthepredicate->deletionsequenceisatomic *(i.e.protectedbytheGIL),assumingthepredicateitselfdoesn't *releasetheGIL. */
3、PyDict_DelItemIf
int _PyDict_DelItemIf(PyObject*op,PyObject*key, int(*predicate)(PyObject*value)) { Py_ssize_thashpos,ix; PyDictObject*mp; Py_hash_thash; PyObject*old_value; intres; if(!PyDict_Check(op)){ PyErr_BadInternalCall(); return-1; } assert(key); hash=PyObject_Hash(key); if(hash==-1) return-1; mp=(PyDictObject*)op; ix=(mp->ma_keys->dk_lookup)(mp,key,hash,&old_value); if(ix==DKIX_ERROR) return-1; if(ix==DKIX_EMPTY||old_value==NULL){ _PyErr_SetKeyError(key); return-1; } //Splittabledoesn'tallowdeletion.Combineit. if(_PyDict_HasSplitTable(mp)){ if(dictresize(mp,DK_SIZE(mp->ma_keys))){ return-1; } ix=(mp->ma_keys->dk_lookup)(mp,key,hash,&old_value); assert(ix>=0); } res=predicate(old_value); if(res==-1) return-1; hashpos=lookdict_index(mp->ma_keys,hash,ix); assert(hashpos>=0); if(res>0) returndelitem_common(mp,hashpos,ix,old_value); else return0; }
二、删除pop(k)
实现
stu_info={"xiedi":28,"liuhailin":27,"daiqiao":30,"hanwenhai":25,"chenqun":38} print(stu_info) stu_info.pop("liuhailin") print(stu_info)
输出结果:
{'xiedi':28,'liuhailin':27,'daiqiao':30,'hanwenhai':25,'chenqun':38} {'xiedi':28,'daiqiao':30,'hanwenhai':25,'chenqun':38}
1、_PyDict_Pop
PyObject* _PyDict_Pop(PyObject*dict,PyObject*key,PyObject*deflt) { Py_hash_thash; if(((PyDictObject*)dict)->ma_used==0){ if(deflt){ Py_INCREF(deflt); returndeflt; } _PyErr_SetKeyError(key); returnNULL; } if(!PyUnicode_CheckExact(key)|| (hash=((PyASCIIObject*)key)->hash)==-1){ hash=PyObject_Hash(key); if(hash==-1) returnNULL; } return_PyDict_Pop_KnownHash(dict,key,hash,deflt); }
2、_PyDict_Pop_KnownHash
/*Internalversionofdict.pop().*/ PyObject* _PyDict_Pop_KnownHash(PyObject*dict,PyObject*key,Py_hash_thash,PyObject*deflt) { Py_ssize_tix,hashpos; PyObject*old_value,*old_key; PyDictKeyEntry*ep; PyDictObject*mp; assert(PyDict_Check(dict)); mp=(PyDictObject*)dict; if(mp->ma_used==0){ if(deflt){ Py_INCREF(deflt); returndeflt; } _PyErr_SetKeyError(key); returnNULL; } ix=(mp->ma_keys->dk_lookup)(mp,key,hash,&old_value); if(ix==DKIX_ERROR) returnNULL; if(ix==DKIX_EMPTY||old_value==NULL){ if(deflt){ Py_INCREF(deflt); returndeflt; } _PyErr_SetKeyError(key); returnNULL; } //Splittabledoesn'tallowdeletion.Combineit. if(_PyDict_HasSplitTable(mp)){ if(dictresize(mp,DK_SIZE(mp->ma_keys))){ returnNULL; } ix=(mp->ma_keys->dk_lookup)(mp,key,hash,&old_value); assert(ix>=0); } hashpos=lookdict_index(mp->ma_keys,hash,ix); assert(hashpos>=0); assert(old_value!=NULL); mp->ma_used--; mp->ma_version_tag=DICT_NEXT_VERSION(); dictkeys_set_index(mp->ma_keys,hashpos,DKIX_DUMMY); ep=&DK_ENTRIES(mp->ma_keys)[ix]; ENSURE_ALLOWS_DELETIONS(mp); old_key=ep->me_key; ep->me_key=NULL; ep->me_value=NULL; Py_DECREF(old_key); ASSERT_CONSISTENT(mp); returnold_value; }
三、随机删除一个元素popitem()
stu_info={"xiedi":28,"liuhailin":27,"daiqiao":30,"hanwenhai":25,"chenqun":38} print(stu_info) stu_info.popitem() print(stu_info)
输出结果:
{'xiedi':28,'liuhailin':27,'daiqiao':30,'hanwenhai':25,'chenqun':38} {'xiedi':28,'liuhailin':27,'daiqiao':30,'hanwenhai':25}
1、dict_popitem_impl
/*[clinicinput] dict.popitem Removeandreturna(key,value)pairasa2-tuple. PairsarereturnedinLIFO(last-in,first-out)order. RaisesKeyErrorifthedictisempty. [clinicstartgeneratedcode]*/ staticPyObject* dict_popitem_impl(PyDictObject*self) /*[clinicendgeneratedcode:output=e65fcb04420d230dinput=1c38a49f21f64941]*/ { Py_ssize_ti,j; PyDictKeyEntry*ep0,*ep; PyObject*res; /*Allocatetheresulttuplebeforecheckingthesize.Believeit *ornot,thisallocationcouldtriggeragarbagecollectionwhich *couldemptythedict,soifwecheckedthesizefirstandthat *happened,theresultwouldbeaninfiniteloop(searchingforan *entrythatnolongerexists).Notethattheusualpopitem() *idiomis"whiled:k,v=d.popitem()".soneedingtothrowthe *tupleawayifthedict*is*emptyisn'tasignificant *inefficiency--possible,butunlikelyinpractice. */ res=PyTuple_New(2); if(res==NULL) returnNULL; if(self->ma_used==0){ Py_DECREF(res); PyErr_SetString(PyExc_KeyError,"popitem():dictionaryisempty"); returnNULL; } /*Convertsplittabletocombinedtable*/ if(self->ma_keys->dk_lookup==lookdict_split){ if(dictresize(self,DK_SIZE(self->ma_keys))){ Py_DECREF(res); returnNULL; } } ENSURE_ALLOWS_DELETIONS(self); /*Poplastitem*/ ep0=DK_ENTRIES(self->ma_keys); i=self->ma_keys->dk_nentries-1; while(i>=0&&ep0[i].me_value==NULL){ i--; } assert(i>=0); ep=&ep0[i]; j=lookdict_index(self->ma_keys,ep->me_hash,i); assert(j>=0); assert(dictkeys_get_index(self->ma_keys,j)==i); dictkeys_set_index(self->ma_keys,j,DKIX_DUMMY); PyTuple_SET_ITEM(res,0,ep->me_key); PyTuple_SET_ITEM(res,1,ep->me_value); ep->me_key=NULL; ep->me_value=NULL; /*Wecan'tdk_usable++sincethereisDKIX_DUMMYinindices*/ self->ma_keys->dk_nentries=i; self->ma_used--; self->ma_version_tag=DICT_NEXT_VERSION(); ASSERT_CONSISTENT(self); returnres; }
四、查找(key值在字典中存在)
1、dict_keys
staticPyObject* dict_keys(PyDictObject*mp) { PyObject*v; Py_ssize_ti,j; PyDictKeyEntry*ep; Py_ssize_tn,offset; PyObject**value_ptr; again: n=mp->ma_used; v=PyList_New(n); if(v==NULL) returnNULL; if(n!=mp->ma_used){ /*Durnit.Theallocationscausedthedicttoresize. *Juststartover,thisshouldn'tnormallyhappen. */ Py_DECREF(v); gotoagain; } ep=DK_ENTRIES(mp->ma_keys); if(mp->ma_values){ value_ptr=mp->ma_values; offset=sizeof(PyObject*); } else{ value_ptr=&ep[0].me_value; offset=sizeof(PyDictKeyEntry); } for(i=0,j=0;j2、PyDict_Keys
PyObject* PyDict_Keys(PyObject*mp) { if(mp==NULL||!PyDict_Check(mp)){ PyErr_BadInternalCall(); returnNULL; } returndict_keys((PyDictObject*)mp); } PyObject* PyDict_Values(PyObject*mp) { if(mp==NULL||!PyDict_Check(mp)){ PyErr_BadInternalCall(); returnNULL; } returndict_values((PyDictObject*)mp); }五、get(k)
1、dict_get_impl
staticPyObject* dict_get_impl(PyDictObject*self,PyObject*key,PyObject*default_value) /*[clinicendgeneratedcode:output=bba707729dee05bfinput=279ddb5790b6b107]*/ { PyObject*val=NULL; Py_hash_thash; Py_ssize_tix; if(!PyUnicode_CheckExact(key)|| (hash=((PyASCIIObject*)key)->hash)==-1){ hash=PyObject_Hash(key); if(hash==-1) returnNULL; } ix=(self->ma_keys->dk_lookup)(self,key,hash,&val); if(ix==DKIX_ERROR) returnNULL; if(ix==DKIX_EMPTY||val==NULL){ val=default_value; } Py_INCREF(val); returnval; }2、_PyDict_GetItem_KnownHash
/*SameasPyDict_GetItemWithError()butwithhashsuppliedbycaller. ThisreturnsNULL*with*anexceptionsetifanexceptionoccurred. ItreturnsNULL*without*anexceptionsetifthekeywasn'tpresent. */ PyObject* _PyDict_GetItem_KnownHash(PyObject*op,PyObject*key,Py_hash_thash) { Py_ssize_tix; PyDictObject*mp=(PyDictObject*)op; PyObject*value; if(!PyDict_Check(op)){ PyErr_BadInternalCall(); returnNULL; } ix=(mp->ma_keys->dk_lookup)(mp,key,hash,&value); if(ix<0){ returnNULL; } returnvalue; }3、_PyDict_GetItemId
PyObject* _PyDict_GetItemId(PyObject*dp,struct_Py_Identifier*key) { PyObject*kv; kv=_PyUnicode_FromId(key);/*borrowed*/ if(kv==NULL){ PyErr_Clear(); returnNULL; } returnPyDict_GetItem(dp,kv); } /*Forbackwardcompatibilitywitholddictionaryinterface*/4、PyDict_GetItemString
PyObject* PyDict_GetItemString(PyObject*v,constchar*key) { PyObject*kv,*rv; kv=PyUnicode_FromString(key); if(kv==NULL){ PyErr_Clear(); returnNULL; } rv=PyDict_GetItem(v,kv); Py_DECREF(kv); returnrv; } int _PyDict_SetItemId(PyObject*v,struct_Py_Identifier*key,PyObject*item) { PyObject*kv; kv=_PyUnicode_FromId(key);/*borrowed*/ if(kv==NULL) return-1; returnPyDict_SetItem(v,kv,item); } int PyDict_SetItemString(PyObject*v,constchar*key,PyObject*item) { PyObject*kv; interr; kv=PyUnicode_FromString(key); if(kv==NULL) return-1; PyUnicode_InternInPlace(&kv);/*XXXShouldwereally?*/ err=PyDict_SetItem(v,kv,item); Py_DECREF(kv); returnerr; }六、setdefault(k,v)
setdefault()表示去取字典中的key,如果取不到,则设置新值,相反如果取到,则返回原有默认值
1、dict_setdefault_impl
/*[clinicinput] dict.setdefault key:object default:object=None / Insertkeywithavalueofdefaultifkeyisnotinthedictionary. Returnthevalueforkeyifkeyisinthedictionary,elsedefault. [clinicstartgeneratedcode]*/ staticPyObject* dict_setdefault_impl(PyDictObject*self,PyObject*key, PyObject*default_value) /*[clinicendgeneratedcode:output=f8c1101ebf69e220input=0f063756e815fd9d]*/ { PyObject*val; val=PyDict_SetDefault((PyObject*)self,key,default_value); Py_XINCREF(val); returnval; } staticPyObject* dict_clear(PyDictObject*mp,PyObject*Py_UNUSED(ignored)) { PyDict_Clear((PyObject*)mp); Py_RETURN_NONE; } /*[clinicinput] dict.pop key:object default:object=NULL /2、PyDict_SetDefault
PyObject* PyDict_SetDefault(PyObject*d,PyObject*key,PyObject*defaultobj) { PyDictObject*mp=(PyDictObject*)d; PyObject*value; Py_hash_thash; if(!PyDict_Check(d)){ PyErr_BadInternalCall(); returnNULL; } if(!PyUnicode_CheckExact(key)|| (hash=((PyASCIIObject*)key)->hash)==-1){ hash=PyObject_Hash(key); if(hash==-1) returnNULL; } if(mp->ma_keys==Py_EMPTY_KEYS){ if(insert_to_emptydict(mp,key,hash,defaultobj)<0){ returnNULL; } returndefaultobj; } if(mp->ma_values!=NULL&&!PyUnicode_CheckExact(key)){ if(insertion_resize(mp)<0) returnNULL; } Py_ssize_tix=(mp->ma_keys->dk_lookup)(mp,key,hash,&value); if(ix==DKIX_ERROR) returnNULL; if(_PyDict_HasSplitTable(mp)&& ((ix>=0&&value==NULL&&mp->ma_used!=ix)|| (ix==DKIX_EMPTY&&mp->ma_used!=mp->ma_keys->dk_nentries))){ if(insertion_resize(mp)<0){ returnNULL; } ix=DKIX_EMPTY; } if(ix==DKIX_EMPTY){ PyDictKeyEntry*ep,*ep0; value=defaultobj; if(mp->ma_keys->dk_usable<=0){ if(insertion_resize(mp)<0){ returnNULL; } } Py_ssize_thashpos=find_empty_slot(mp->ma_keys,hash); ep0=DK_ENTRIES(mp->ma_keys); ep=&ep0[mp->ma_keys->dk_nentries]; dictkeys_set_index(mp->ma_keys,hashpos,mp->ma_keys->dk_nentries); Py_INCREF(key); Py_INCREF(value); MAINTAIN_TRACKING(mp,key,value); ep->me_key=key; ep->me_hash=hash; if(_PyDict_HasSplitTable(mp)){ assert(mp->ma_values[mp->ma_keys->dk_nentries]==NULL); mp->ma_values[mp->ma_keys->dk_nentries]=value; } else{ ep->me_value=value; } mp->ma_used++; mp->ma_version_tag=DICT_NEXT_VERSION(); mp->ma_keys->dk_usable--; mp->ma_keys->dk_nentries++; assert(mp->ma_keys->dk_usable>=0); } elseif(value==NULL){ value=defaultobj; assert(_PyDict_HasSplitTable(mp)); assert(ix==mp->ma_used); Py_INCREF(value); MAINTAIN_TRACKING(mp,key,value); mp->ma_values[ix]=value; mp->ma_used++; mp->ma_version_tag=DICT_NEXT_VERSION(); } ASSERT_CONSISTENT(mp); returnvalue; }七、update(dict)
update()是把两个字典合并成一个新的字典,中间有交叉的key,更新替换成新值,没有交叉就直接创建
1、dict_update_common
staticint dict_update_common(PyObject*self,PyObject*args,PyObject*kwds, constchar*methname) { PyObject*arg=NULL; intresult=0; if(!PyArg_UnpackTuple(args,methname,0,1,&arg)){ result=-1; } elseif(arg!=NULL){ if(PyDict_CheckExact(arg)){ result=PyDict_Merge(self,arg,1); } else{ _Py_IDENTIFIER(keys); PyObject*func; if(_PyObject_LookupAttrId(arg,&PyId_keys,&func)<0){ result=-1; } elseif(func!=NULL){ Py_DECREF(func); result=PyDict_Merge(self,arg,1); } else{ result=PyDict_MergeFromSeq2(self,arg,1); } } } if(result==0&&kwds!=NULL){ if(PyArg_ValidateKeywordArguments(kwds)) result=PyDict_Merge(self,kwds,1); else result=-1; } returnresult; }2、dict_update
staticPyObject* dict_update(PyObject*self,PyObject*args,PyObject*kwds) { if(dict_update_common(self,args,kwds,"update")!=-1) Py_RETURN_NONE; returnNULL; } /*Updateunconditionallyreplacesexistingitems. Mergehasa3rdargument'override';ifset,itactslikeUpdate, otherwiseitleavesexistingitemsunchanged. PyDict_{Update,Merge}update/mergefromamappingobject. PyDict_MergeFromSeq2updates/mergesfromanyiterableobject producingiterableobjectsoflength2. */3、PyDict_Update
int PyDict_Update(PyObject*a,PyObject*b) { returndict_merge(a,b,1); }八、items()将字典转换为列表
1、PyDict_Items
PyObject* PyDict_Items(PyObject*mp) { if(mp==NULL||!PyDict_Check(mp)){ PyErr_BadInternalCall(); returnNULL; } returndict_items((PyDictObject*)mp); } /*Return1ifdictsequal,0ifnot,-1iferror. *Getsoutassoonasanydifferenceisdetected. *UsesonlyPy_EQcomparison. */九、fromkeys(list,默认值)
1、_PyDict_FromKeys
/*Internalversionofdict.from_keys().Itissubclass-friendly.*/ PyObject* _PyDict_FromKeys(PyObject*cls,PyObject*iterable,PyObject*value) { PyObject*it;/*iter(iterable)*/ PyObject*key; PyObject*d; intstatus; d=_PyObject_CallNoArg(cls); if(d==NULL) returnNULL; if(PyDict_CheckExact(d)&&((PyDictObject*)d)->ma_used==0){ if(PyDict_CheckExact(iterable)){ PyDictObject*mp=(PyDictObject*)d; PyObject*oldvalue; Py_ssize_tpos=0; PyObject*key; Py_hash_thash; if(dictresize(mp,ESTIMATE_SIZE(PyDict_GET_SIZE(iterable)))){ Py_DECREF(d); returnNULL; } while(_PyDict_Next(iterable,&pos,&key,&oldvalue,&hash)){ if(insertdict(mp,key,hash,value)){ Py_DECREF(d); returnNULL; } } returnd; } if(PyAnySet_CheckExact(iterable)){ PyDictObject*mp=(PyDictObject*)d; Py_ssize_tpos=0; PyObject*key; Py_hash_thash; if(dictresize(mp,ESTIMATE_SIZE(PySet_GET_SIZE(iterable)))){ Py_DECREF(d); returnNULL; } while(_PySet_NextEntry(iterable,&pos,&key,&hash)){ if(insertdict(mp,key,hash,value)){ Py_DECREF(d); returnNULL; } } returnd; } } it=PyObject_GetIter(iterable); if(it==NULL){ Py_DECREF(d); returnNULL; } if(PyDict_CheckExact(d)){ while((key=PyIter_Next(it))!=NULL){ status=PyDict_SetItem(d,key,value); Py_DECREF(key); if(status<0) gotoFail; } }else{ while((key=PyIter_Next(it))!=NULL){ status=PyObject_SetItem(d,key,value); Py_DECREF(key); if(status<0) gotoFail; } } if(PyErr_Occurred()) gotoFail; Py_DECREF(it); returnd; Fail: Py_DECREF(it); Py_DECREF(d); returnNULL; }2、dict_fromkeys_impl
staticPyObject* dict_fromkeys_impl(PyTypeObject*type,PyObject*iterable,PyObject*value) /*[clinicendgeneratedcode:output=8fb98e4b10384999input=382ba4855d0f74c3]*/ { return_PyDict_FromKeys((PyObject*)type,iterable,value); } staticint dict_update_common(PyObject*self,PyObject*args,PyObject*kwds, constchar*methname) { PyObject*arg=NULL; intresult=0; if(!PyArg_UnpackTuple(args,methname,0,1,&arg)){ result=-1; } elseif(arg!=NULL){ if(PyDict_CheckExact(arg)){ result=PyDict_Merge(self,arg,1); } else{ _Py_IDENTIFIER(keys); PyObject*func; if(_PyObject_LookupAttrId(arg,&PyId_keys,&func)<0){ result=-1; } elseif(func!=NULL){ Py_DECREF(func); result=PyDict_Merge(self,arg,1); } else{ result=PyDict_MergeFromSeq2(self,arg,1); } } } if(result==0&&kwds!=NULL){ if(PyArg_ValidateKeywordArguments(kwds)) result=PyDict_Merge(self,kwds,1); else result=-1; } returnresult; } /*Note:dict.update()usestheMETH_VARARGS|METH_KEYWORDScallingconvention. UsingMETH_FASTCALL|METH_KEYWORDSwouldmakedict.update(**dict2)calls slower,seetheissue#29312.*/十、Clea清空字典
1、PyDict_ClearFreeList
int PyDict_ClearFreeList(void) { PyDictObject*op; intret=numfree+numfreekeys; while(numfree){ op=free_list[--numfree]; assert(PyDict_CheckExact(op)); PyObject_GC_Del(op); } while(numfreekeys){ PyObject_FREE(keys_free_list[--numfreekeys]); } returnret; }2、PyDict_Clea
void PyDict_Clear(PyObject*op) { PyDictObject*mp; PyDictKeysObject*oldkeys; PyObject**oldvalues; Py_ssize_ti,n; if(!PyDict_Check(op)) return; mp=((PyDictObject*)op); oldkeys=mp->ma_keys; oldvalues=mp->ma_values; if(oldvalues==empty_values) return; /*Emptythedict...*/ dictkeys_incref(Py_EMPTY_KEYS); mp->ma_keys=Py_EMPTY_KEYS; mp->ma_values=empty_values; mp->ma_used=0; mp->ma_version_tag=DICT_NEXT_VERSION(); /*...thenclearthekeysandvalues*/ if(oldvalues!=NULL){ n=oldkeys->dk_nentries; for(i=0;idk_refcnt==1); dictkeys_decref(oldkeys); } ASSERT_CONSISTENT(mp); } 3、dict_clear
staticPyObject* dict_clear(PyDictObject*mp,PyObject*Py_UNUSED(ignored)) { PyDict_Clear((PyObject*)mp); Py_RETURN_NONE; }4、dict_tp_clear
staticint dict_tp_clear(PyObject*op) { PyDict_Clear(op); return0; }更多关于Python字典添加,删除,查询等相关操作方法的文章请查看下面的相关链接
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。