python list for 循环问题

时间:2021-10-28 00:11:13

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,

高手帮我看看,为什么我得不到我想要的结果呢,有什么方法可以得到我想要的结果吗

12 个解决方案

#1


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

#2


for i in p:应该要极力避免去改变p。while里随便起个整数当list下标来访问元素,然后循环递增这个整数...

#3


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

就可以实现你要的

#4


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


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

当然我实际作的东西不是这个,这只是我简化之后写的测试代码,但意思是一样的,就是处理一个list,碰到特殊情况生成一个新list,转而去处理这个新生成的list

#5


引用 4 楼 largetalk 的回复:
引用 1 楼 iambic 的回复:

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


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

当然我……



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

#6



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

这是你要的吧。

#7


引用 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)):
 ……


#8


ref#4
我的意思是将列表中4之前的元素打印出来,4之后的不打印……


既然旧的不要了应该if i==4: break 先跳出for范围再说,还在while里后头可以再入for循环

#9


引用 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)):
 ……


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

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

#10


我前面那个程序有错大概是因为在for语句中的i的迭代,在python内部实现里还是用了它在p中的index

#11


向被遍历列表中增加和删除元素很容易导致循环异常, 如果必须修改被遍历列表, 前提必须保证不能影响循环正常进行,并且,符合欲实现业务的逻辑的要求,即,属于合理行为。

#12


引用 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)):
 ……


不对,这个还是有点不太对,这个没有考虑新的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

#1


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

#2


for i in p:应该要极力避免去改变p。while里随便起个整数当list下标来访问元素,然后循环递增这个整数...

#3


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

就可以实现你要的

#4


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


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

当然我实际作的东西不是这个,这只是我简化之后写的测试代码,但意思是一样的,就是处理一个list,碰到特殊情况生成一个新list,转而去处理这个新生成的list

#5


引用 4 楼 largetalk 的回复:
引用 1 楼 iambic 的回复:

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


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

当然我……



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

#6



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

这是你要的吧。

#7


引用 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)):
 ……


#8


ref#4
我的意思是将列表中4之前的元素打印出来,4之后的不打印……


既然旧的不要了应该if i==4: break 先跳出for范围再说,还在while里后头可以再入for循环

#9


引用 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)):
 ……


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

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

#10


我前面那个程序有错大概是因为在for语句中的i的迭代,在python内部实现里还是用了它在p中的index

#11


向被遍历列表中增加和删除元素很容易导致循环异常, 如果必须修改被遍历列表, 前提必须保证不能影响循环正常进行,并且,符合欲实现业务的逻辑的要求,即,属于合理行为。

#12


引用 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)):
 ……


不对,这个还是有点不太对,这个没有考虑新的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