【问题标题】:Can I combine 2 list comprehensions in a single line?我可以在一行中组合 2 个列表推导吗?
【发布时间】:2021-10-15 02:58:23
【问题描述】:

这是我的 Python 代码的一部分:

pstat1 = [plotvex(alpha,beta,j)[0] for j in range(5)]
ptset1 = [plotvex(alpha,beta,j)[1] for j in range(5)]

其中plotvex 是一个返回2 个项目的函数。我想使用列表理解生成两个列表pstat1ptset1,但我想知道有没有一种方法我不需要调用该函数两次?谢谢:)

【问题讨论】:

标签: python list-comprehension


【解决方案1】:

您不希望为每组参数调用两次plotvex() 函数,这是非常正确的。

所以,只需调用一次,然后生成pstat1pstat2

pv = [plotvex(alpha,beta,j) for j in range(5)]
pstat1 = [item[0] for item in pv]
ptset1 = [item[1] for item in pv]

【讨论】:

    【解决方案2】:

    假设 plotvex() 准确返回一个 2 元组*,这应该可以工作:

    pstat1, ptset1 = zip(*[plotvex(alpha, beta, j) for j in range(5)])
    

    zip(*iterable_of_iterables) 是一个常用的习惯用法,用于将列表列表从垂直“旋转”为水平。因此,[plotvex(alpha, beta, j) for j in range(5)] 将不再是一个 2 元组列表,而是两个单项列表,每半个元组一个列表。

    * 这里是参数解包操作符。


    *如果它返回多于一个 2 元组,则只需执行 plotvex(alpha, beta, j)[:2] 代替前两个元素

    【讨论】:

    • 如果 plotvex 不返回 2 元组,另一种解决方案是执行 pstat1, ptset1, *_ = zip(*[plotvex(alpha, beta, j) for j in range(5)])
    • 感谢您的回答,有没有办法可以直接将pstat1ptset1 作为列表返回?
    • @ZR- 如果你需要,你可以在外面添加另一个理解来将元组转换为列表 - [list(tup) for tup in zip(...)],它不应该伤害任何东西
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多