从列表中删除字典

2023-12-02

如果我有一个字典列表,请说:

[{'id': 1, 'name': 'paul'},
 {'id': 2, 'name': 'john'}]

我想删除字典id共 2 个(或姓名'john'),以编程方式处理此问题的最有效方法是什么(也就是说,我不知道列表中条目的索引,因此不能简单地弹出它)。


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

Edit:正如在对此代码性能的评论中表达的一些疑问(有些是基于对 Python 性能特征的误解,有些是基于超出给定规格的假设,即列表中恰好有一个字典的键 'id 的值为 2) ’),我想就这一点提供保证。

在旧的 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

(使用next内置的而不是.next当然,如果您使用的是 Python 2.6 或更高版本,则可以使用此方法)——但是如果满足删除条件的字典数量不完全是 1,则此代码会崩溃。概括这一点,我们有:

$ 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 著名论文“过早优化是编程中万恶之源”!-)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

从列表中删除字典 的相关文章

随机推荐

  • QFile 打开文件写入失败

    我正在尝试打开文件并向其中写入一些文本数据 QFile out test txt if out open QIODevice ReadWrite QMessageBox msgBox msgBox setText out errorStri
  • Python virtualenv 问题

    我在 Windows XP 上使用 VirtualEnv 我想知道我的大脑是否正确地围绕它 I ran virtualenv ENV它创造了C WINDOWS system32 ENV 然后我改变了我的PATH要包含的变量C WINDOWS
  • 矩阵的块对角绑定

    R 是否具有将矩阵绑定为块对角形状的基函数 以下可以完成这项工作 但我想知道是否有标准方法 a lt matrix 1 6 2 3 b lt matrix 7 10 2 2 rbind cbind a matrix 0 nrow nrow
  • 复制包含索引的表

    有没有办法在 SQL Server 中复制表 不仅仅是像这样的数据SELECT INTO还可以索引 也许还有键 如果我走脚本表为 gt 创建到它遗漏了我的索引 如果此功能不可用 为什么不呢 我确信这个问题肯定被问了 1000 次 但我找不到
  • 关于C中的qsort(),** buf和buf[][]的区别

    当我在 Mac 上的 C 语言中使用 qsort 时 这些代码运行良好 它可以很好地对一个文件中的每一行进行排序 int compare const void p const void q return strcmp p q void fu
  • 如何在jtree中仅列出非隐藏和非系统文件

    File f new File C File fList f listFiles 当我使用它时 它会列出所有系统文件以及隐藏文件 而这个原因空指针异常当我用它在 jTree 中显示时 如下所示 public void getList Def
  • 从所有浏览器注销用户

    我在用着表单验证mechanizm 和 auth 用户通过 FormsAuthentication SetAuthCookie Can I logout当前用户来自所有浏览器不知何故 在认证参数中添加一个guid参数 还将 guid 保存到
  • 动态CRM插件下载Word文档

    我创建了 CRM 插件 在创建案例时需要将文档下载到客户端 当我创建案例时 插件正在工作 但它不下载文档 在控制台中我可以看到通过 POST 请求返回文档内容 AppWebServices InlineEditWebService asmx
  • 如何将从 sha1 字节数组生成的字符串返回到该字节数组?

    首先很抱歉英语不好 好吧 我想从 torrent 文件中读取片段哈希信息 目前 我正在使用https github com hyPiRion java bencode这个 Bencode 库来解码信息 但我的问题是当我想将片段字符串转换为字
  • 自定义MKOverlayRenderer drawMapRect函数不绘制多边形

    我构建了一个自定义 MKOverlayRenderer 来构建多边形 应用混合模式 然后将它们添加到地图视图中 在我的drawMapRect函数中 我使用CGPoints数组来构建多边形 并创建一条路径 但是 在运行时 我的地图视图上没有显
  • JavaScript:一个变量可以有多个值吗?

    除了 jQuery 之外 我对 JavaScript 还很陌生 我正在阅读 JavaScript 数组中的随机化以及使用带有随机数的 Array sort 方法的缺点 我看到建议是使用 Fisher Yates 洗牌 查看此方法的 Java
  • 导入错误:没有名为 base 的模块

    我正在尝试为我的第一次登录测试实现 PageObject 模式 运行时我收到以下错误 gt gt py test v test login py test session starts platform linux2 Python 2 7
  • Django OneToOne 反向关系当空时DoesNotExists

    我正在使用 Django 1 8 3 以及 Rest Framework 和 json api https github com django json api django rest framework json api 我有这种一对一的
  • Java 中的斐波那契数列耗时太长?

    我试图在 Java 中找到斐波那契数列的总和 但运行时间太长 或者是应该的 每当我使用超过 40 的整数时 速度都会变慢 注意 在 50 时 返回负值 这让我很困惑 有什么建议吗 public static void main String
  • JAAS认证新手;使用 URL 栏中的令牌登录 [关闭]

    Closed 这个问题需要多问focused 目前不接受答案 我有一个有趣的项目要求 我们必须接受令牌作为 GET 参数 以对进入应用程序的用户进行身份验证 这是为了允许受信任的第三方将用户无缝地发送到我们的网站 而无需让他们再次登录 一个
  • IE 中的 org.openqa.selenium.NoSuchElementException 错误,但相同的代码在 Chrome 和 Firefox 中工作正常

    我编写了一个登录脚本 当我使用 ChromeDirver 和 FFDriver 执行它时 它工作正常 但是当我使用 IE 驱动程序运行相同的命令时 它失败并给出以下错误 Exception in thread main org openqa
  • SVG 在 Firefox 中仅部分显示

    我目前正在使用 SVG 格式的瑞士地图 这
  • 在ADT中使用Drawerlayout时,选项列表中没有显示layout_width属性

    我是 Android 新手 我研究了 Google 的导航抽屉示例http developer android com training implementing navigation nav drawer html 我在 eclipse
  • 带有母版页/模板的 React Router V4 路由器

    我对反应和尝试创建一个具有两种设计的应用程序相对较新 一种是具有公共页眉和页脚的公共网站 以及具有管理页眉和侧栏的内部应用程序 我创建了一个路由器和 2 个主路由 和 app 然后我添加了子路由 希望如果父路由器匹配 它将显示父组件并将子路
  • 从列表中删除字典

    如果我有一个字典列表 请说 id 1 name paul id 2 name john 我想删除字典id共 2 个 或姓名 john 以编程方式处理此问题的最有效方法是什么 也就是说 我不知道列表中条目的索引 因此不能简单地弹出它 thel