有没有办法捕获列表理解中的失误?

2024-03-30

基于简单的列表理解:

yay = [ i for i in a if a[i] ]
nay = [ i for i in a if not a[i] ]

我想知道是否有一种方法可以同时分配yay and nay一次值(即条件上的命中和未命中)?

看起来像这样的东西

( yay , nay ) = ...

我对可读性和速度感到好奇(我有点惊讶地发现两个列表推导式比附加到任一列表的单个 for 循环快大约 5%)


update:

最初的示例是获取字典中“true”和“false”值键的列表......

a = {i: i >= 50 for i in range(100)}

yay = [k for k, v in a.items() if v]
nay = [k for k, v in a.items() if not v]

这里通常的解决方案是不要完全沉迷于使用列表理解的想法。只需使用一个for loop:

yay, nay = [], []
for i in a:
    if somecondition(i):
        yay.append(i)
    else:
        nay.append(i)

如果您发现自己经常这样做,那么只需将代码移到一个函数中即可:

def yesno(seq, cond):
    yay, nay = [], []
    for i in seq:
        if cond(i):
            yay.append(i)
        else:
            nay.append(i)
    return yay, nay

yay, nay = yesno(a, lambda x: a[x])

评论表明这比列表理解慢。将条件作为 lambda 传递不可避免地会产生很大的影响,我认为您对此无能为力,但一些性能影响可能来自于查找append方法及可改进之处:

def yesno(seq, cond):
    yay, nay = [], []
    yes, no = yay.append, nay.append
    for i in seq:
        if cond(i):
            yes(i)
        else:
            no(i)
    return yay, nay

我不知道这是否会产生很大的影响,但计时可能会很有趣。

在评论中 @martineau 建议使用生成器并使用它any()。我将把它放在这里,但我会替换any使用 itertools 配方来使用迭代器:

def consume(iterator, n):
    "Advance the iterator n-steps ahead. If n is none, consume entirely."
    # Use functions that consume iterators at C speed.
    if n is None:
        # feed the entire iterator into a zero-length deque
        collections.deque(iterator, maxlen=0)
    else:
        # advance to the empty slice starting at position n
        next(islice(iterator, n, n), None)

然后你可以写:

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

有没有办法捕获列表理解中的失误? 的相关文章

随机推荐

  • 如何在 Windows 8 中以编程方式检查/切换飞行模式?

    我必须检查 Windows 8 中是否启用了飞行模式 并且可能需要切换其状态 我目前正在开发 C NET 4 0 Windows 窗体应用程序 但此问题的答案不应受此限制 不幸的是 Metro 应用程序没有一种编程方式来更改 Windows
  • 使用 API 创建 Amazon EC2 实例

    com amazonaws services ec2 是否包含从现有 AMI 创建全新 EC2 实例的方法 我希望通过 Java SDK 而不是 Web 管理控制台来执行此操作 以下是使用 Amazon AWS SDK for Java 创
  • Spring STS 不适用于 Gradle

    我已经下载了Spring STS 我创建了一个项目 新的 spring 启动项目 并选择了 gradle buildship 它说我没有 需要从市场上购买 我去了市场 得到了它 重新启动 创建了一个示例 gradle java 项目并编译它
  • MultipartEntityBuilder 从 Android httpurlconnection 发送数据

    我正在尝试更改 HTTPClient 已弃用的代码 但我在 setEntity 上收到错误 因为它已损坏 而且我不知道如何通过新的 httpConnectionUrl 来 paas MultipartEntityBuilder 我旧的已弃用
  • Postgres 使用数组格式化字符串

    我正在寻找一种使用数组格式化字符串的简单方法 如下所示 select format using array Hello s and s ARRAY Jane Joe format using array Hello Jane and Joe
  • 在react-virtualized 中添加padding-top

    我有一个
  • 如何检测父元素中的任何子元素是否具有某个类?

    我试图检测父 图库 div 中的任何子div 是否具有 show 类 div div class show div div div div div div if TEST CONDITION alert sub element with t
  • 从 OpenID 提供商检索电子邮件地址的通用参数

    在我的网站中 我使用基于 OpenID 的身份验证 我正在向 OpenID 提供商请求 电子邮件地址 问题是每个提供商在身份验证后在 GET 响应中以自己的参数发送电子邮件地址 我列出了我所看到的三个 堆栈交换 openid alias3
  • 在 EMR 4.0 中启动 Spark 时出错

    我创建了一个EMR 4 0AWS 中的实例以及所有可用的应用程序 包括Spark 我通过 AWS 控制台手动完成此操作 我启动了集群并在启动时通过 SSH 连接到主节点 我跑到那里pyspark 当我收到以下错误时pyspark尝试创造Sp
  • JUnit5 测试未从“application-test.yml”加载属性

    我正在尝试为我的服务类编写单元测试 该服务类依赖于配置属性类 MyService java Service RequiredArgsConstructor public class MyService private final MyCon
  • jmeter-如何获取当前日期和时间(以秒为单位)

    我想计算当前时间 以秒为单位 并将其用作我的 jmeter 测试计划中的参数 默认情况下 时间以毫秒为单位 有人可以帮我吗 您可以使用 time 函数 http jmeter apache org usermanual functions
  • SQL 查询来计算不同值的数量

    x y A P A P B P B Q 你好 我需要一个查询来返回 x 的所有唯一值 有多少个不同的 y 因此 对于上述数据 它将返回 x count A 1 B 2 Thanks 使用 GROUP BY 和COUNT DISTINCT h
  • 使用 ndk-gdb 调试 Android 本机应用程序

    我正在尝试在 eclipse 中使用 ndk gdb 调试具有一些本机 c 代码的 android 应用程序 似乎 gdb 服务器从命令行成功启动并正在接受命令 但在 Eclipse 中却显示了这个错误 从设备获取文件时出错 com and
  • UCWA 或 UCMA API 是否支持 Skype for Business Online?

    我们正在尝试找出最新的UCWA https msdn microsoft com en us library office dn324971 v office 16 aspx or UCMA https msdn microsoft com
  • Elastic beanstalk需要python 3.5

    我最近使用最新的稳定版本的 python 3 5 创建了一个新的 python 程序 不幸的是 AWS EB 不提供 3 5 基础镜像 我一直在尝试配置 ebextensions获取图像来升级 python 发行版 这是第一个操作 我还没有
  • 插入 id(自动生成,仅列)

    如果我想在表中插入一行 而该表只包含一个具有自动生成 ID 的列 那么我的 SQL 语句 MS SQL 应该是什么样子 以下两个查询不起作用 INSERT INTO MyTable MyTableId VALUES Null or simp
  • 你能解释一下这个查询的逻辑吗

    我有一个查询 查找薪水第四高的老师的姓名 我不明白这部分 SELECT COUNT DISTINCT T2 salary FROM teacher as T2 WHERE T2 salary gt T1 salary 3 from SELE
  • PHP文件夹权限问题

    我正在尝试使用 PHP 创建一个文件夹 然后在其中创建另一个文件夹 如果这是我的目录结构 home site owner user1 现在 我使用创建文件夹 mkdir home site newdir 0777 user apache 目
  • Tkinter 标签文本在特定循环中重叠

    我正在使用 Python 和 Tkinter 开发一个 简单 搜索界面 这是我得到的一些示例代码 usr bin env python from tkinter import import os import csv import sys
  • 有没有办法捕获列表理解中的失误?

    基于简单的列表理解 yay i for i in a if a i nay i for i in a if not a i 我想知道是否有一种方法可以同时分配yay and nay一次值 即条件上的命中和未命中 看起来像这样的东西 yay