<span id="mktg5"></span>

<i id="mktg5"><meter id="mktg5"></meter></i>

        <label id="mktg5"><meter id="mktg5"></meter></label>
        最新文章專題視頻專題問答1問答10問答100問答1000問答2000關(guān)鍵字專題1關(guān)鍵字專題50關(guān)鍵字專題500關(guān)鍵字專題1500TAG最新視頻文章推薦1 推薦3 推薦5 推薦7 推薦9 推薦11 推薦13 推薦15 推薦17 推薦19 推薦21 推薦23 推薦25 推薦27 推薦29 推薦31 推薦33 推薦35 推薦37視頻文章20視頻文章30視頻文章40視頻文章50視頻文章60 視頻文章70視頻文章80視頻文章90視頻文章100視頻文章120視頻文章140 視頻2關(guān)鍵字專題關(guān)鍵字專題tag2tag3文章專題文章專題2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章專題3
        問答文章1 問答文章501 問答文章1001 問答文章1501 問答文章2001 問答文章2501 問答文章3001 問答文章3501 問答文章4001 問答文章4501 問答文章5001 問答文章5501 問答文章6001 問答文章6501 問答文章7001 問答文章7501 問答文章8001 問答文章8501 問答文章9001 問答文章9501
        當(dāng)前位置: 首頁 - 科技 - 知識百科 - 正文

        Python中遍歷字典過程中更改元素導(dǎo)致異常的解決方法

        來源:懂視網(wǎng) 責(zé)編:小采 時間:2020-11-27 14:36:51
        文檔

        Python中遍歷字典過程中更改元素導(dǎo)致異常的解決方法

        Python中遍歷字典過程中更改元素導(dǎo)致異常的解決方法:先來回顧一下Python中遍歷字典的一些基本方法: 腳本: #!/usr/bin/python dict={a:apple,b:banana,o:orange} print ##########dict###################### for i in dict: print dict[%s
        推薦度:
        導(dǎo)讀Python中遍歷字典過程中更改元素導(dǎo)致異常的解決方法:先來回顧一下Python中遍歷字典的一些基本方法: 腳本: #!/usr/bin/python dict={a:apple,b:banana,o:orange} print ##########dict###################### for i in dict: print dict[%s

        先來回顧一下Python中遍歷字典的一些基本方法:
        腳本:

        #!/usr/bin/python 
        dict={"a":"apple","b":"banana","o":"orange"} 
         
        print "##########dict######################" 
        for i in dict: 
         print "dict[%s]=" % i,dict[i] 
         
        print "###########items#####################" 
        for (k,v) in dict.items(): 
         print "dict[%s]=" % k,v 
         
        print "###########iteritems#################" 
        for k,v in dict.iteritems(): 
         print "dict[%s]=" % k,v 
         
        print "###########iterkeys,itervalues#######" 
        for k,v in zip(dict.iterkeys(),dict.itervalues()): 
         print "dict[%s]=" % k,v
        

        執(zhí)行結(jié)果:

        ##########dict###################### 
        dict[a]= apple 
        dict[b]= banana 
        dict[o]= orange 
        ###########items##################### 
        dict[a]= apple 
        dict[b]= banana 
        dict[o]= orange 
        ###########iteritems################# 
        dict[a]= apple 
        dict[b]= banana 
        dict[o]= orange 
        ###########iterkeys,itervalues####### 
        dict[a]= apple 
        dict[b]= banana 
        dict[o]= orange
        

        嗯,然后我們進(jìn)入“正題”--

        一段關(guān)于Python字典遍歷的“爭論”....
        先摘抄下:

        #這里初始化一個dict
        >>> d = {'a':1, 'b':0, 'c':1, 'd':0}
        #本意是遍歷dict,發(fā)現(xiàn)元素的值是0的話,就刪掉
        >>> for k in d:
        ... if d[k] == 0:
        ... del(d[k])
        ...
        Traceback (most recent call last):
         File "", line 1, in 
        RuntimeError: dictionary changed size during iteration
        #結(jié)果拋出異常了,兩個0的元素,也只刪掉一個。
        >>> d
        {'a': 1, 'c': 1, 'd': 0}
        
        >>> d = {'a':1, 'b':0, 'c':1, 'd':0}
        #d.keys() 是一個下標(biāo)的數(shù)組
        >>> d.keys()
        ['a', 'c', 'b', 'd']
        #這樣遍歷,就沒問題了,因?yàn)槠鋵?shí)其實(shí)這里遍歷的是d.keys()這個list常量。
        >>> for k in d.keys():
        ... if d[k] == 0:
        ... del(d[k])
        ...
        >>> d
        {'a': 1, 'c': 1}
        #結(jié)果也是對的
        >>>
        
        #這里初始化一個dict
        >>> d = {'a':1, 'b':0, 'c':1, 'd':0}
        #本意是遍歷dict,發(fā)現(xiàn)元素的值是0的話,就刪掉
        >>> for k in d:
        ... if d[k] == 0:
        ... del(d[k])
        ...
        Traceback (most recent call last):
         File "", line 1, in 
        RuntimeError: dictionary changed size during iteration
        #結(jié)果拋出異常了,兩個0的元素,也只刪掉一個。
        >>> d
        {'a': 1, 'c': 1, 'd': 0}
         
        >>> d = {'a':1, 'b':0, 'c':1, 'd':0}
        #d.keys() 是一個下標(biāo)的數(shù)組
        >>> d.keys()
        ['a', 'c', 'b', 'd']
        #這樣遍歷,就沒問題了,因?yàn)槠鋵?shí)其實(shí)這里遍歷的是d.keys()這個list常量。
        >>> for k in d.keys():
        ... if d[k] == 0:
        ... del(d[k])
        ...
        >>> d
        {'a': 1, 'c': 1}
        #結(jié)果也是對的
        >>>
        
        

        其實(shí)這個問題本來很簡單,就是說如果遍歷一個字典,但是在遍歷中改變了他,比如增刪某個元素,就會導(dǎo)致遍歷退出,并且拋出一個dictionary changed size during iteration的異常.
        解決方法是遍歷字典鍵值,以字典鍵值為依據(jù)遍歷,這樣改變了value以后不會影響遍歷繼續(xù)。
        但是下面又有一位大神拋出高論:

        首先,python 是推薦使用迭代器的,也就是 for k in adict 形式。其次,在遍歷中刪除容器中的元素,在 C++ STL 和 Python 等庫中,都是不推薦的,因?yàn)檫@種情況往往說明了你的設(shè)計(jì)方案有問題,所有都有特殊要求,對應(yīng)到 python 中,就是要使用 adict.key() 做一個拷貝。最后,所有的 Python 容器都不承諾線程安全,你要多線程做這件事,本身就必須得加鎖,這也說明了業(yè)務(wù)代碼設(shè)計(jì)有問題的.

        但由“遍歷中刪除特定元素”這種特例,得出“遍歷dict的時候,養(yǎng)成使用 for k in d.keys() 的習(xí)慣”,我覺得有必要糾正一下。在普通的遍歷中,應(yīng)該使用 for k in adict。
        另外,對于“遍歷中刪除元素”這種需求,pythonic 的做法是 adict = {k, v for adict.iteritems() if v != 0} 或 alist = [i for i in alist if i != 0]

        這個寫法讓我眼前一亮:怎么還有這個語法?
        再仔細(xì)一看,他可能是這個意思:

        #!/usr/bin/env python
        # -*- coding=utf-8 -*-
        a = {'a':1, 'b':0, 'c':1, 'd':0}
        b={}
        for k,v in a.items():
         if v != 0:
         b.update({k:v})
        adict = b
        del b
        print a
        
        #!/usr/bin/env python
        # -*- coding=utf-8 -*-
        a = {'a':1, 'b':0, 'c':1, 'd':0}
        b={}
        for k,v in a.items():
         if v != 0:
         b.update({k:v})
        adict = b
        del b
        print a
        
        

        不知道對不對。
        因?yàn)檫@個寫法一開始讓我猛然想到三元操作符,仔細(xì)一看才發(fā)現(xiàn)不是,以前Goolge到有個解決方案

        val = float(raw_input("Age: "))
        status = ("working","retired")[val>65]
        print "You should be",status
        
        val = float(raw_input("Age: "))
        status = ("working","retired")[val>65]
        print "You should be",status
        
        

        val>65是個邏輯表達(dá)式,返回0或者1,剛好作為前面那個元組的ID來取值,實(shí)在是太妙了。。
        不過在Google的資料里面還有一個版本

        #V1 if X else V2
        s = None
        a = "not null" if s == None else s
        print a
        #'not null'
        
        

        后來發(fā)帖在華蟒用戶組(中文Python技術(shù)郵件列表)中提到后眾多大神解答如下:

        >>> alist = [1,2,0,3,0,4,5]
        >>> alist = [i for i in alist if i != 0]
        >>> alist
        
        [1, 2, 3, 4, 5]
        
        >>> d = {'a':1, 'b':0, 'c':1, 'd':0}
        >>> d = dict([(k,v) for k,v in d.iteritems() if v!=0])
        >>> d
        {'a':1,'c':1'}
        
        

        如果大于Python>=2.7
        還可以用這個寫法:

        >>> d = {k:v for k,v in d.iteritems() if v !=0 }
        
        

        聲明:本網(wǎng)頁內(nèi)容旨在傳播知識,若有侵權(quán)等問題請及時與本網(wǎng)聯(lián)系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com

        文檔

        Python中遍歷字典過程中更改元素導(dǎo)致異常的解決方法

        Python中遍歷字典過程中更改元素導(dǎo)致異常的解決方法:先來回顧一下Python中遍歷字典的一些基本方法: 腳本: #!/usr/bin/python dict={a:apple,b:banana,o:orange} print ##########dict###################### for i in dict: print dict[%s
        推薦度:
        標(biāo)簽: 元素 異常 異常的
        • 熱門焦點(diǎn)

        最新推薦

        猜你喜歡

        熱門推薦

        專題
        Top
        主站蜘蛛池模板: 蜜桃精品免费久久久久影院| 91在线视频免费看| 亚洲高清免费视频| 看Aⅴ免费毛片手机播放| 成人免费视频88| 亚洲日本成本人观看| 思思99re66在线精品免费观看| 亚洲人成网站看在线播放| 国产91免费在线观看| 亚洲AV综合色区无码二区爱AV| 99视频在线精品免费观看6| 亚洲精品中文字幕无码A片老| 永久免费AV无码网站在线观看| 亚洲熟妇无码一区二区三区| 日韩精品视频免费网址| 深夜福利在线视频免费| 国产精品亚洲产品一区二区三区| 中文在线观看永久免费| 婷婷久久久亚洲欧洲日产国码AV| 久久A级毛片免费观看| 精品亚洲456在线播放| 国产免费小视频在线观看| 一级特黄特色的免费大片视频 | 成人免费毛片观看| 小说专区亚洲春色校园| 亚洲人精品午夜射精日韩| 伊人久久免费视频| 亚洲中文字幕无码久久2020| 波多野结衣视频在线免费观看| 国产免费播放一区二区| 久久精品a亚洲国产v高清不卡 | 国产真人无遮挡作爱免费视频| 成在线人直播免费视频| 亚洲视频免费播放| 免费看国产一级特黄aa大片| 国产在线精品观看免费观看 | 国产亚洲福利精品一区二区| 亚洲色欲色欲www在线丝| 无人在线观看完整免费版视频 | 91亚洲精品视频| 亚洲国产专区一区|