python 数列问题?

想去去除数列中的所有奇数项(数学中数列的索引从1 开始)一直报错求?
if name == '__main__':

a=[1,2,3,4,5,6,7,8,9,10]
for i in range(0,len(a)):
    if (i+1) % 2 == 0:
        print a[i]
        a.remove(a[i])
阅读 4.6k
8 个回答

len(a) == 10
range(0,10) == [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
也就是说i的值分别是:[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

当你删除了一个元素之后数列a变成了:
[0, 1, 3, 4, 5, 6, 7, 8, 9],此时a的长度是9.

当i == 9 的时候,会用a[9]访问数据组,此时就会越界报错了。

数组是越来越短的,但是迭代的次数被固定下来了。

不用这么麻烦。

a = [1,2,3,4,5,6,7,8,9,10]
a = a[1::2] # 1, 1 + 2, 1 + 4...
print a

我记得有人告诉过我,对数组的操作,都要建立一个新的数组,送给题主

第一你的程序逻辑有问题,判断应该为(a[i] + 1) % 2 == 0
第二你在一个长度固定不变的list上remove一个递增下标最后肯定会导致下标越界,因为remove同时list长度减一!
第三你可以使用 a = range(1, 11) 来代替 a = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

这。。。。时间复杂度是n^2啊...

a = range(1, 10)
[a[i] for i, status in enumerate(map(lambda e : e % 2 == 0, a)) if status]
b=[i for i in a if a%2==0]  #这样就得到过滤完毕的数列

当然楼上提到的

b=a[1::2] 

更优雅

还有,尽量不要在循环迭代过程中去修改被迭代的数据。。不然会出现意想不到的错误

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题