亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > Python > 正文

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

2020-01-04 17:28:24
字體:
來源:轉載
供稿:網友
這篇文章主要介紹了Python中遍歷字典過程中更改元素導致錯誤的解決方法,針對增刪元素后出現dictionary changed size during iteration的異常解決做出討論和解決,需要的朋友可以參考下
 

先來回顧一下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

 

執行結果:

##########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

嗯,然后我們進入“正題”--

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

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

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

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

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

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

#!/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 = bdel bprint 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 = bdel bprint a

不知道對不對。
因為這個寫法一開始讓我猛然想到三元操作符,仔細一看才發現不是,以前Goolge到有個解決方案

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

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

#V1 if X else V2s = Nonea = "not null" if s == None else sprint a#'not null'

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

>>> 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 }
 

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲色图第三页| 日韩美女中文字幕| 亚洲第五色综合网| 亚洲第一免费播放区| 久久精品国产欧美亚洲人人爽| 亚洲成年网站在线观看| 亚洲精品自产拍| 国产免费一区二区三区在线观看| 欧美日韩另类视频| 疯狂做受xxxx欧美肥白少妇| 51精品国产黑色丝袜高跟鞋| 日韩最新免费不卡| 精品中文字幕在线| 日韩av网址在线| 亚洲美女www午夜| 亚洲欧美色婷婷| 久久在线免费视频| 欧美一级大片视频| 久久精品久久久久久| 精品久久久一区二区| 91亚洲精品在线| 欧美成在线观看| 亚洲精品丝袜日韩| 少妇高潮 亚洲精品| 久久成人精品一区二区三区| 国产精品美女在线| 成人xxxxx| 欧美国产日本高清在线| 国产精品免费一区二区三区都可以| 国产精品久久久久久久久免费看| 久久人人爽人人爽人人片av高请| 国产在线视频一区| 国产91免费看片| 亚洲无限av看| 亚洲精品久久久久中文字幕二区| 久久综合伊人77777尤物| 国产一区二区三区在线免费观看| www.日韩系列| xxxxx成人.com| 日韩美女av在线免费观看| 精品国产一区二区三区久久久狼| 欧美成人免费在线视频| 国产精品国产三级国产专播精品人| 国产精品嫩草视频| 插插插亚洲综合网| 国产精品久久久久久网站| 欧美性猛交丰臀xxxxx网站| 欧美日韩爱爱视频| 久久久久久91| 日韩精品中文字幕久久臀| 欧美伊久线香蕉线新在线| 亚洲精品720p| 91精品视频免费| 精品偷拍一区二区三区在线看| 久久夜色精品国产亚洲aⅴ| 欧美性视频网站| 最近2019免费中文字幕视频三| 国产精品黄页免费高清在线观看| 最近2019中文字幕mv免费看| 国产黑人绿帽在线第一区| 久久这里有精品| www.日韩系列| 精品福利在线观看| 亚洲人成电影网站| 久久精品视频播放| 欧美电影免费观看高清完整| 午夜欧美不卡精品aaaaa| 久久精品国产96久久久香蕉| 在线不卡国产精品| 欧美日韩国产123| 久久99精品久久久久久青青91| 欧美一二三视频| 欧美精品videossex性护士| 久久99亚洲热视| 久热在线中文字幕色999舞| 日韩欧美国产网站| 中文字幕精品www乱入免费视频| 欧美在线观看网站| 亚洲字幕在线观看| 欧美成人精品一区二区三区| 黑人极品videos精品欧美裸| 国产亚洲aⅴaaaaaa毛片| 成人美女av在线直播| 欧美电影院免费观看| 另类专区欧美制服同性| 成人国产精品一区二区| 国产视频欧美视频| 成人精品久久久| 成人中文字幕+乱码+中文字幕| 久久这里有精品视频| 日韩中文字幕久久| 欧美丰满片xxx777| 91视频国产精品| 日韩在线小视频| 麻豆一区二区在线观看| 国产欧美一区二区三区四区| 日韩美女av在线| 美女av一区二区| 国内免费精品永久在线视频| 亚洲欧洲日产国码av系列天堂| 日韩成人激情在线| 久久久成人的性感天堂| 96精品视频在线| 日韩av一区在线| 欧美巨乳美女视频| 中文字幕不卡av| 精品亚洲永久免费精品| 在线观看久久久久久| 中文字幕视频在线免费欧美日韩综合在线看| 亚洲精品中文字幕有码专区| 国产精品主播视频| 欧美亚洲成人xxx| 欧美日韩国产一区二区三区| 久久久国产精品免费| 亚洲自拍在线观看| 久久久国产精品视频| 国产视频精品在线| 色噜噜狠狠狠综合曰曰曰88av| 国产精品无码专区在线观看| 免费av一区二区| 在线精品视频视频中文字幕| 91色视频在线导航| 韩国精品美女www爽爽爽视频| 日韩在线观看免费| 最近2019年中文视频免费在线观看| 中文字幕国产精品久久| 日韩欧美在线免费| 亚洲一区二区三区视频播放| 超碰日本道色综合久久综合| 免费91麻豆精品国产自产在线观看| 亚洲大胆人体在线| 大伊人狠狠躁夜夜躁av一区| 中文字幕欧美视频在线| 精品国产1区2区| 欧美大片欧美激情性色a∨久久| 欧美性xxxxxxxxx| 狠狠色香婷婷久久亚洲精品| 亚洲精品国偷自产在线99热| 久久精品中文字幕电影| 日韩精品有码在线观看| 久久69精品久久久久久国产越南| 九九视频这里只有精品| 九九热最新视频//这里只有精品| 国产午夜精品理论片a级探花| 久久久噜噜噜久久| 国产精品免费在线免费| 俺也去精品视频在线观看| 国产精品一区二区电影| 久久久久久亚洲| 欧美日韩成人在线视频| 亚洲色图欧美制服丝袜另类第一页| 成人精品福利视频| 久久激情视频久久| 日韩av手机在线观看| 欧美一区二区大胆人体摄影专业网站| 日韩免费观看av| 丝袜一区二区三区| 久久久久久12| 欧美理论在线观看| 欧美日韩激情视频| 亚洲白虎美女被爆操| 夜夜嗨av色综合久久久综合网| 亚洲视频网站在线观看| 欧美日韩亚洲91|