免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 6401 | 回复: 13
打印 上一主题 下一主题

从list中根据index删除elements [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2013-10-16 03:08 |只看该作者 |倒序浏览
我想从list中根据index删除只出现1次的elements
  1. #!/usr/bin/python

  2. def list_filter(data):
  3.     target_index = []
  4. #find out the indices of the elements to delete
  5.     for i in xrange(len(data)):
  6.         if data.count(data[i]) == 1:
  7.             target_index.append(i)   
  8.     print target_index

  9. #delete
  10.     for j in target_index:
  11.         del data[j]
  12.     return data


  13. print list_filter([1,2,3,4,2])
复制代码
运行出错如下,不知如何解决?

./test.py
[0, 2, 3]
Traceback (most recent call last):
  File "./test.py", line 17, in <module>
    print list_filter([1,2,3,4,2])
  File "./test.py", line 13, in list_filter
    del data[j]
IndexError: list assignment index out of range

论坛徽章:
0
2 [报告]
发表于 2013-10-16 03:31 |只看该作者
自己找到方法了:

   for j in target_index:  =》  for j in reversed(target_index):

论坛徽章:
5
2015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:50:282015年亚洲杯之朝鲜
日期:2015-03-13 22:47:33IT运维版块每日发帖之星
日期:2016-01-09 06:20:00IT运维版块每周发帖之星
日期:2016-03-07 16:27:44
3 [报告]
发表于 2013-10-16 06:50 |只看该作者
mark 学习。

论坛徽章:
13
双鱼座
日期:2013-10-23 09:30:05数据库技术版块每日发帖之星
日期:2016-04-20 06:20:00程序设计版块每日发帖之星
日期:2016-03-09 06:20:002015亚冠之塔什干火车头
日期:2015-11-02 10:07:452015亚冠之德黑兰石油
日期:2015-08-30 10:07:07数据库技术版块每日发帖之星
日期:2015-08-28 06:20:00数据库技术版块每日发帖之星
日期:2015-08-05 06:20:002015年迎新春徽章
日期:2015-03-04 09:57:09辰龙
日期:2014-12-03 14:45:52酉鸡
日期:2014-07-23 09:46:23亥猪
日期:2014-03-13 08:46:22金牛座
日期:2014-02-11 09:36:21
4 [报告]
发表于 2013-10-16 09:25 |只看该作者
def list_filter(data):
    for i in data:
        if data.count(i) == 1:
            data.remove(i)
    return data

论坛徽章:
0
5 [报告]
发表于 2013-10-16 10:12 |只看该作者
本帖最后由 neilengineer 于 2013-10-16 10:14 编辑
bikong0411 发表于 2013-10-16 09:25
def list_filter(data):
    for i in data:
        if data.count(i) == 1:
            data.remove(i)
    return data


这样不行哦,会出问题的,我试过了。

print list_filter([1, 2, 3, 4, 5])
结果是: [2, 4]
正确结果应该是: []

论坛徽章:
13
双鱼座
日期:2013-10-23 09:30:05数据库技术版块每日发帖之星
日期:2016-04-20 06:20:00程序设计版块每日发帖之星
日期:2016-03-09 06:20:002015亚冠之塔什干火车头
日期:2015-11-02 10:07:452015亚冠之德黑兰石油
日期:2015-08-30 10:07:07数据库技术版块每日发帖之星
日期:2015-08-28 06:20:00数据库技术版块每日发帖之星
日期:2015-08-05 06:20:002015年迎新春徽章
日期:2015-03-04 09:57:09辰龙
日期:2014-12-03 14:45:52酉鸡
日期:2014-07-23 09:46:23亥猪
日期:2014-03-13 08:46:22金牛座
日期:2014-02-11 09:36:21
6 [报告]
发表于 2013-10-16 10:24 |只看该作者
回复 5# neilengineer


sorry,写错了,因为range的是data,这样就好了
def list_filter(data):
    local_data = data[:]
    for i in data:
        if local_data.count(i) == 1:
            local_data.remove(i)
    return local_data

论坛徽章:
0
7 [报告]
发表于 2013-10-16 10:29 |只看该作者
本帖最后由 neilengineer 于 2013-10-16 10:30 编辑

回复 6# bikong0411

3Q,能否解释下原来在data那个list上操作为什么不行吗?
   

论坛徽章:
0
8 [报告]
发表于 2013-10-16 13:24 |只看该作者
话说好像reversed的方法我也用过。。
原来那样当然不行,你remove掉一个元素之后,index:0->1,但是这时list已经变成[2,3,4,5],就把2跳过了。4同理

论坛徽章:
4
酉鸡
日期:2014-03-21 23:19:50狮子座
日期:2014-08-01 22:11:40酉鸡
日期:2015-01-10 21:31:442015年辞旧岁徽章
日期:2015-03-03 16:54:15
9 [报告]
发表于 2013-10-16 17:08 |只看该作者
8楼正解。。。

论坛徽章:
0
10 [报告]
发表于 2013-10-17 05:53 |只看该作者
本帖最后由 neilengineer 于 2013-10-17 05:56 编辑

回复 8# laike9m

def list_filter(data):
    for i in data:
        if data.count(i) == 1:
            data.remove(i)
    return data

不会啊,index变了没关系啊,for用的是list里的元素,又不是用index。

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP