python list for 循环问题

largetalk 2010-04-01 10:58:20

p=[1,2,3,4,5,6]
while True:
for i in p:
if i==4:
p=[]
f=[9,8,7]
p.extend(f)
break
print i,',',
p.remove(i)

if not p:
break
#expect output is:1,2,3,9,8,7,

高手帮我看看,为什么我得不到我想要的结果呢,有什么方法可以得到我想要的结果吗
...全文
1960 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
largetalk 2010-04-01
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 iambic 的回复:]

一、禁止在for遍历的时候修改被遍历的对象。
二、尽量少写for循环。
三、没看明白你想要做什么实际的事情。你稍微解释下吧。要看懂一段错误的代码本来想做什么事情是比较难的。
[/Quote]

我的意思是将列表中4之前的元素打印出来,4之后的不打印,但每次遇见4的时候会有一个新的list要打印,这个list中也有可能有4,处理和前面list一样

当然我实际作的东西不是这个,这只是我简化之后写的测试代码,但意思是一样的,就是处理一个list,碰到特殊情况生成一个新list,转而去处理这个新生成的list
zhoujin4500 2010-04-01
  • 打赏
  • 举报
回复
for i in p:
---> i是列表p的元素
p.remove(i)
--->这个i是列表p的索引

另外:
p=[1,2,3,4,5,6]
f=[9,8,7]
p[p.index(4):]=f

就可以实现你要的

angel_su 2010-04-01
  • 打赏
  • 举报
回复
for i in p:应该要极力避免去改变p。while里随便起个整数当list下标来访问元素,然后循环递增这个整数...
iambic 2010-04-01
  • 打赏
  • 举报
回复
一、禁止在for遍历的时候修改被遍历的对象。
二、尽量少写for循环。
三、没看明白你想要做什么实际的事情。你稍微解释下吧。要看懂一段错误的代码本来想做什么事情是比较难的。
largetalk 2010-04-01
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 zxo102 的回复:]

Python code

p=[1,2,3,4,5,6]

while True:
for i in p:
if i==4:
f=[9,8,7]
p=p[:p.index(i)]
p.extend(f)
break
#for j in range(len(p)):
……
[/Quote]

不对,这个还是有点不太对,这个没有考虑新的list f中也含有4的情况
将上面我那个再修改一下:这里的xx是输入,是一个序列数组,前一个序列含有4后面的序列才会被输入,最后一个序列一定不能有4

#!/usr/bin/env python

xx=[(5,2,4,5),(3,4,6,2),(2,3,6)]
def pp(p,b,N):
for num,i in enumerate(p):
if i == 4:
p=[]
x=xx[N]
p.extend(x)
break
print num,i
b.append(i)
# print 'len=',len(p)
if num == len(p)-1:
p=[]
return p

if __name__ == '__main__':
f =[1,2,3,2,4,5,6,7,8]
c=[]
n=0
while f:
f =pp(f,c,n)
n=n+1
print c
fibbery 2010-04-01
  • 打赏
  • 举报
回复
向被遍历列表中增加和删除元素很容易导致循环异常, 如果必须修改被遍历列表, 前提必须保证不能影响循环正常进行,并且,符合欲实现业务的逻辑的要求,即,属于合理行为。
largetalk 2010-04-01
  • 打赏
  • 举报
回复
我前面那个程序有错大概是因为在for语句中的i的迭代,在python内部实现里还是用了它在p中的index
largetalk 2010-04-01
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 zxo102 的回复:]

Python code

p=[1,2,3,4,5,6]

while True:
for i in p:
if i==4:
f=[9,8,7]
p=p[:p.index(i)]
p.extend(f)
break
#for j in range(len(p)):
……
[/Quote]

这个确实可以,比我后来自己写的一个好

def pp(p,b):
for num,i in enumerate(p):
if i == 4:
p=[]
x=[9,8,7,5,6,2,7,5,6,2,3]
p.extend(x)
break
print num,i
b.append(i)
# print 'len=',len(p)
if num == len(p)-1:
p=[]
return p


if __name__ == '__main__':
f =[1,2,3,2,4]
c=[]
while f:
f =pp(f,c)

print c
angel_su 2010-04-01
  • 打赏
  • 举报
回复
[Quote=ref#4]
我的意思是将列表中4之前的元素打印出来,4之后的不打印……
[/Quote]

既然旧的不要了应该if i==4: break 先跳出for范围再说,还在while里后头可以再入for循环
starboy520 2010-04-01
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 zxo102 的回复:]

Python code

p=[1,2,3,4,5,6]

while True:
for i in p:
if i==4:
f=[9,8,7]
p=p[:p.index(i)]
p.extend(f)
break
#for j in range(len(p)):
……
[/Quote]

zxo102 2010-04-01
  • 打赏
  • 举报
回复

p=[1,2,3,4,5,6]

while True:
for i in p:
if i==4:
f=[9,8,7]
p=p[:p.index(i)]
p.extend(f)
break
#for j in range(len(p)):
# print p[j],","
print ",".join([str(d) for d in p])
break

这是你要的吧。
starboy520 2010-04-01
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 largetalk 的回复:]

引用 1 楼 iambic 的回复:

一、禁止在for遍历的时候修改被遍历的对象。
二、尽量少写for循环。
三、没看明白你想要做什么实际的事情。你稍微解释下吧。要看懂一段错误的代码本来想做什么事情是比较难的。


我的意思是将列表中4之前的元素打印出来,4之后的不打印,但每次遇见4的时候会有一个新的list要打印,这个list中也有可能有4,处理和前面list一样

当然我……
[/Quote]


#!/usr/bin/python

p = [1,2,3,4,5,6]
for i in p:
if i == 4:
p[i:]=[7,8,9]
else:
print i

37,720

社区成员

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

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