python列表删除_Python:从列表中删除字典

thelist[:] = [d for d in thelist if d.get('id') != 2]

编辑:由于对此代码的性能提出了一些疑问(一些基于对Python的性能特征的误解,一些基于超出给定规范的假设,即列表中仅存在一个dict,其key的值为2) id”),我希望在此方面给您保证。

在旧的Linux机器上,测量以下代码:

$ python -mtimeit -s"lod=[{'id':i, 'name':'nam%s'%i} for i in range(99)]; import random" "thelist=list(lod); random.shuffle(thelist); thelist[:] = [d for d in thelist if d.get('id') != 2]"

10000 loops, best of 3: 82.3 usec per loop

其中random.shuffle(需要确保要删除的元素始终不在同一位置;-大约需要57微秒),而初始副本则需要0.65微秒(对于Python列表的浅表副本的性能影响最大的人) 显然是在吃午饭了;-),需要避免更改循环中的原始列表(因此循环的每一段确实都有一些要删除的内容;-)。

当知道只有一个要删除的项目时,可以更快地找到和删除它:

$ python -mtimeit -s"lod=[{'id':i, 'name':'nam%s'%i} for i in range(99)]; import random" "thelist=list(lod); random.shuffle(thelist); where=(i for i,d in enumerate(thelist) if d.get('id')==2).next(); del thelist[where]"

10000 loops, best of 3: 72.8 usec per loop

(当然,如果您使用的是python 2.6或更高版本,请使用内置的next而不是.next方法)-但是,如果满足删除条件的命令数量不完全相同,则此代码将崩溃。 概括地说,我们有:

$ python -mtimeit -s"lod=[{'id':i, 'name':'nam%s'%i} for i in range(33)]*3; import random" "thelist=list(lod); where=[i for i,d in enumerate(thelist) if d.get('id')==2]; where.reverse()" "for i in where: del thelist[i]"

10000 loops, best of 3: 23.7 usec per loop

众所周知,在这里可以删除混洗,因为已经有三个等距的字典可以删除。 listcomp保持不变:

$ python -mtimeit -s"lod=[{'id':i, 'name':'nam%s'%i} for i in range(33)]*3; import random" "thelist=list(lod); thelist[:] = [d for d in thelist if d.get('id') != 2]"

10000 loops, best of 3: 23.8 usec per loop

完全并驾齐驱,甚至只需删除99个元素中的3个。 有了更长的列表和更多的重复,这当然具有更多的优势:

$ python -mtimeit -s"lod=[{'id':i, 'name':'nam%s'%i} for i in range(33)]*133; import random" "thelist=list(lod); where=[i for i,d in enumerate(thelist) if d.get('id')==2]; where.reverse()" "for i in where: del thelist[i]"

1000 loops, best of 3: 1.11 msec per loop

$ python -mtimeit -s"lod=[{'id':i, 'name':'nam%s'%i} for i in range(33)]*133; import random" "thelist=list(lod); thelist[:] = [d for d in thelist if d.get('id') != 2]"

1000 loops, best of 3: 998 usec per loop

总而言之,显然不值得部署制作和反转索引列表以删除的精妙之处,而不是完全简单明了的列表理解,在一个小情况下可能获得100纳秒,而在较大的情况下则损失113毫秒。 ;-)。 避免或批评简单,直接和完美的性能适当的解决方案(例如对此类“从列表中删除某些物品”问题的一般理解),是Knuth和Hoare的著名论点,即“过早的优化是 编程中所有邪恶的根源!!)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值