python 一个列表删除元素的怪问题

zhenzhu6485 2017-07-31 02:46:33

i=browser.find_elements_by_css_selector('a[class="W_textb"]') #记录时间标题
j=0
jilu=[]

for item in i:
print(item.text)
if(j<=len(i)):
jilu.append(item.text)
j+=1
print(jilu)

T_TITLE=(find_all_index(jilu,'分享'))

print(T_TITLE)

j=0
while (j<=len(T_TITLE)):
del i[T_TITLE[j]]
j+=1


for item in i:
print(item.text)


很简单一段代码,但是不知道为毛有个怪问题,我一开始用 for item 遍历列表值作为索引删除含'分享'的网页元素,但始终少删一个,现在用
while (j<=len(T_TITLE)):
del i[T_TITLE[j]]
j+=1

居然提示IndexError: list index out of range ???可前段代码执行结果毫无问题啊!
前段结果:
['7月21日10:02', '今天02:48', '7月28日22:29', '分享', '分享', '分享', '7月22日17:50', '7月29日03:36', '7月14日12:39', '7月26日15:46', '7月24日17:58', '7月25日20:02', '7月25日18:53', '7月25日08:51', '7月25日02:12', '7月25日07:55', '7月25日03:47', '7月25日02:48', '7月24日01:46', '7月25日02:03', '7月7日02:30', '7月25日01:17', '7月23日23:40', '7月25日00:07', '7月24日23:43', '3月23日19:52']
[3, 4, 5]
Traceback (most recent call last):
File "C:\Users\Kevin D\Desktop\代购.py", line 557, in <module>
del i[T_TITLE[j]]
IndexError: list index out of range

上一个类似处理,我用了append加遍历提取元素转新列表,丝毫没问题,怎么现在用del会出这怪错??求教,谢谢

...全文
305 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
zhenzhu6485 2017-08-01
  • 打赏
  • 举报
回复
引用 11 楼 chuifengde 的回复:
改成if '分享' in item.text:
不行滴,虽然知道不可能,刚还是试了下
chuifengde 2017-08-01
  • 打赏
  • 举报
回复
为什么要在一棵树上吊死?换种方法不就行了,方法多的是 1.生成新的列表 2.从列表的后面往前删 3.过滤等等 再来说说为什么你这种删有毛病 你for item in i: if item.text=='分享': i.remove(item) 这个遍历中,item并不是随i值的变化而实时更新的,它是按第一次的i来遍历递增的 当你第一次遍历到index为3的值‘分享’时,这时删除了它,随即i中index=4及之后的所有项都向前移了1位,但你再循环一次时, item并不是从index=3开始,而遍历的index4了,这个时候index4的'分享'是最初的index5的值,删了它接着遍历,所以有一个分享没有删掉,也就是最初i的第index=4的值没删掉。你不信,你在最后一个‘分享’后再加一个分享试试,执行完程序你肯定有两个分享删不掉
sanGuo_uu 2017-07-31
  • 打赏
  • 举报
回复
优雅高效? 你去查下filter
#-*-coding:utf-8-*-

orgList=[u'7月21日10:02', u'今天02:48', u'7月28日22:29', u'分享', u'分享', u'分享', u'7月22日17:50', u'7月29日03:36', u'7月14日12:39', u'7月26日15:46', u'7月24日17:58', u'7月25日20:02', u'7月25日18:53', u'7月25日08:51', u'7月25日02:12', u'7月25日07:55', u'7月25日03:47', u'7月25日02:48', u'7月24日01:46', u'7月25日02:03', u'7月7日02:30', u'7月25日01:17', u'7月23日23:40', u'7月25日00:07', u'7月24日23:43', u'3月23日19:52']

print filter(lambda x:x!=u'分享',orgList)
zhenzhu6485 2017-07-31
  • 打赏
  • 举报
回复
引用 4 楼 u012536120 的回复:
有的时候,在循环里面操作循环变量是大忌。 (比如一个list,你循环的时候删除它的项,就会导致它的index不准;当然你的问题是不是这样子造成的,我不确定) 可以用下面的思路写: (python3里面不需要u,print加上括号就可以)
#-*-coding:utf-8-*-

orgList=[u'7月21日10:02', u'今天02:48', u'7月28日22:29', u'分享', u'分享', u'分享', u'7月22日17:50', u'7月29日03:36', u'7月14日12:39', u'7月26日15:46', u'7月24日17:58', u'7月25日20:02', u'7月25日18:53', u'7月25日08:51', u'7月25日02:12', u'7月25日07:55', u'7月25日03:47', u'7月25日02:48', u'7月24日01:46', u'7月25日02:03', u'7月7日02:30', u'7月25日01:17', u'7月23日23:40', u'7月25日00:07', u'7月24日23:43', u'3月23日19:52']
res=[]

for item in orgList:
	if item!=u'分享':
		print item
		res.append(item)
谢谢,我一开始也想这么写,不过不太高效,假如因为index顺序改变导致问题,也讲不通,因为内容上看,我想保留的内容都保留了,只是少删了个‘分享’,假如因为index改变导致错误,那应该误删掉一个,可没出现这问题
zhenzhu6485 2017-07-31
  • 打赏
  • 举报
回复
感谢各位,这样啊,看起来还是append成新表更靠谱,不过为了写起来更高效优雅,嘿嘿
tianfang 2017-07-31
  • 打赏
  • 举报
回复
删除一个元素后,顺序号,总数都变了 可以从最后向前删除,也可以删除第一个,一直到空
sanGuo_uu 2017-07-31
  • 打赏
  • 举报
回复
有的时候,在循环里面操作循环变量是大忌。 (比如一个list,你循环的时候删除它的项,就会导致它的index不准;当然你的问题是不是这样子造成的,我不确定) 可以用下面的思路写: (python3里面不需要u,print加上括号就可以)
#-*-coding:utf-8-*-

orgList=[u'7月21日10:02', u'今天02:48', u'7月28日22:29', u'分享', u'分享', u'分享', u'7月22日17:50', u'7月29日03:36', u'7月14日12:39', u'7月26日15:46', u'7月24日17:58', u'7月25日20:02', u'7月25日18:53', u'7月25日08:51', u'7月25日02:12', u'7月25日07:55', u'7月25日03:47', u'7月25日02:48', u'7月24日01:46', u'7月25日02:03', u'7月7日02:30', u'7月25日01:17', u'7月23日23:40', u'7月25日00:07', u'7月24日23:43', u'3月23日19:52']
res=[]

for item in orgList:
	if item!=u'分享':
		print item
		res.append(item)
zhenzhu6485 2017-07-31
  • 打赏
  • 举报
回复
引用 1 楼 u012536120 的回复:
报错索引超出,是要改这个: while (j<len(T_TITLE)):——把等号去掉
谢谢,可怎么用while,还是有个‘分享’删不掉呢? ['7月28日22:29', '今天02:48', '7月21日10:02', '分享', '分享', '分享', '7月24日17:58', '今天11:54', '7月22日17:50', '7月29日03:36', '7月14日12:39', '7月26日15:46', '7月25日20:02', '7月25日13:41', '7月25日13:33', '7月25日08:51', '7月25日02:12', '7月25日07:55', '7月25日03:47', '7月25日02:48', '7月24日01:46', '7月25日02:03', '7月7日02:30', '7月25日01:17', '7月23日23:40', '7月25日00:07'] [3, 4, 5] 7月28日22:29 今天02:48 7月21日10:02 分享 7月24日17:58 7月22日17:50 7月29日03:36 7月14日12:39 7月26日15:46 7月25日20:02 7月25日13:41 7月25日13:33 7月25日08:51 7月25日02:12 7月25日07:55 7月25日03:47 7月25日02:48 7月24日01:46 7月25日02:03 7月7日02:30 7月25日01:17 7月23日23:40 7月25日00:07 跟之前for item效果一样,3个遗留一个
secsilm 2017-07-31
  • 打赏
  • 举报
回复
删除列表元素一般是使用列表推导式:[item for item in a_list if '分享' not in item]
sanGuo_uu 2017-07-31
  • 打赏
  • 举报
回复
报错索引超出,是要改这个: while (j<len(T_TITLE)):——把等号去掉
chuifengde 2017-07-31
  • 打赏
  • 举报
回复
改成if '分享' in item.text:
zhenzhu6485 2017-07-31
  • 打赏
  • 举报
回复
苍天啊~~~我已经把代码简化成这样了,咋还是有项‘分享’删不了,,,已试过3种方式,while,for item,转新表再调用index删除

'''
i=browser.find_elements_by_css_selector('a[class="W_textb"]') #记录时间标题
for item in i:
    if item.text=='分享':
        i.remove(item)
     
   
for item in i: 
    print(item.text)
结果还是: 7月21日10:02 今天02:48 今天20:03 分享 今天21:56 今天20:36 7月22日17:50 7月24日17:58 今天11:54 7月29日03:36 7月14日12:39 7月25日22:43 7月25日22:22 7月25日22:16 7月25日21:35 7月25日21:08 7月25日20:56 7月25日20:32 7月25日20:02 7月25日18:51 7月25日13:33 7月14日12:41 切腹了啊我要,列表存的webelement,调用其attribute做的处理,有没有搞错啊,始终有一项删漏~~~~~Aaaaa
zhenzhu6485 2017-07-31
  • 打赏
  • 举报
回复
引用 8 楼 u012536120 的回复:
优雅高效? 你去查下filter
#-*-coding:utf-8-*-

orgList=[u'7月21日10:02', u'今天02:48', u'7月28日22:29', u'分享', u'分享', u'分享', u'7月22日17:50', u'7月29日03:36', u'7月14日12:39', u'7月26日15:46', u'7月24日17:58', u'7月25日20:02', u'7月25日18:53', u'7月25日08:51', u'7月25日02:12', u'7月25日07:55', u'7月25日03:47', u'7月25日02:48', u'7月24日01:46', u'7月25日02:03', u'7月7日02:30', u'7月25日01:17', u'7月23日23:40', u'7月25日00:07', u'7月24日23:43', u'3月23日19:52']

print filter(lambda x:x!=u'分享',orgList)
谢谢

37,717

社区成员

发帖
与我相关
我的任务
社区描述
JavaScript,VBScript,AngleScript,ActionScript,Shell,Perl,Ruby,Lua,Tcl,Scala,MaxScript 等脚本语言交流。
社区管理员
  • 脚本语言(Perl/Python)社区
  • IT.BOB
加入社区
  • 近7日
  • 近30日
  • 至今

试试用AI创作助手写篇文章吧