python 数列问题?
黄舟
黄舟 2017-04-17 17:36:28
[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])
黄舟
黄舟

人生最曼妙的风景,竟是内心的淡定与从容!

全部回复(8)
ringa_lee

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]访问数据组,此时就会越界报错了。

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

PHP中文网

不用这么麻烦。

a = [1,2,3,4,5,6,7,8,9,10]
a = a[1::2] # 1, 1 + 2, 1 + 4...
print a
天蓬老师
a[1::2]
巴扎黑

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

伊谢尔伦

第一你的程序逻辑有问题,判断应该为(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] 

更优雅

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

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号