【问题标题】:How to return 2 lists from 2 lists using List Comprehension syntax?如何使用列表理解语法从 2 个列表中返回 2 个列表?
【发布时间】:2020-04-19 07:16:28
【问题描述】:

对所有人来说, 我正在对列表理解语法的使用进行一些搜索。我想看看是否可以使用 1 行代码从 2 个现有列表中返回 2 个列表,即使用列表理解。我偶然发现了这个帖子 Possible to return two lists from a list comprehension? 这让我觉得这是可能的。独立创建新列表效果很好我想看看我能走多远,即最少的代码但仍然易于阅读

考虑以下我有 2 个预先存在的列表 wnv 和 wdv,并希望创建 2 个新列表 Av 和 Bv,如下所示;

Av,Bv=[(zeta*wn*dt,wd*dt) for i,(wn,wd) in zip(wnv,wdv)]

其中 zeta 和 dt 只是一个数字 这可以做到吗?使用上面的代码,我得到了错误:unpack non-iterable float object

【问题讨论】:

  • 您能否展示wnvwdv 的结构以及在没有列表理解的情况下您是如何做到的?
  • 两个列表的长度是否相同?如果列表的长度不同,您希望发生什么?
  • 您分享的链接不是完全回答了您的问题吗?
  • 1.现在我看到在行首添加了 zip() 链接是有意义的。 2. 列表将始终与它们从 1 个列表中“发出”的长度相同。 3. 我在“主”列表上有 For ... 循环,在其中我即时计算了一些变量,然后我使用列表理解方法测试了每个所需列表的 1 行代码,最后意识到也许我可以创建一些列表使用 1 行代码。我没有测试过“1-line”方法是否真的更快

标签: python list-comprehension


【解决方案1】:

你已经接近了,你只需要在最后解压缩结果:

Av,Bv = zip(*[(zeta*wn*dt,wd*dt) for (wn,wd) in zip(wnv,wdv)])

(并从您的代码中删除 i

【讨论】:

    【解决方案2】:

    该错误显示为 zip 创建了一个迭代的元组列表(每个都有 2 个元素)。在这里,只有元组 (wn, wd) 是从正在迭代的列表中获取的,而不是变量 i。

    以下代码应该可以正常工作:

    Av,Bv = zip(*[(zeta*wn*dt,wd*dt) for (wn,wd) in zip(wnv,wdv)])

    PS,请注意最终结果 Av 和 Bv 实际上是元组而不是列表。

    【讨论】:

    • Av 和 Bv 中的数据在计算中被“冻结”了,所以元组可能没问题。但是,您可以生成列表而不是元组吗?
    • 可以使用 list() 方法将元组转换为列表。此方法还可以用于列表(显然)、元组、集合和字典(它返回键列表)
    • 关闭问题。测试了一个包含 200,000 个元素的主列表。使用列表理解语法,在 (3 x 2 个列表 1-go 和 3 个列表 1-go 中创建 8 个列表需要 1.113 秒。每次创建 8 个列表需要 0.771 秒
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-22
    • 1970-01-01
    相关资源
    最近更新 更多