【问题标题】:Can i add two elements at once in a list comprehension?我可以在列表理解中一次添加两个元素吗?
【发布时间】:2021-12-03 20:09:02
【问题描述】:

我想要的输出:

[[(1,1)], [(2,2)], [(2,2)], [(4,4)], [(3,3)], [(6,6)]]

这是不起作用的代码:

mylist = [[[(x,x)], [(x*2,x*2)]] for x in range(1, 4)]

我知道我可以使用:

mylist = []
[mylist.extend([[(x,x)], [(x*2,x*2)]]) for x in range(1, 4)]

但是有没有办法把它写在一行中? 我的脚本代码有点复杂,上面的例子只是为了展示原理。所以没有意义。

【问题讨论】:

  • [x*e for x in range(1, 4) for e in range(1, 3)]
  • @deceze 只是一个细节,但我认为 OP 想要[[x*e] for …]
  • mylist = [[x*y] for x in range(1, 4) for y in range(1, 3)]
  • @BrutusForcus 谢谢你的回答,我意识到我问得太不清楚了。我稍微改了一下。

标签: python python-3.x list list-comprehension


【解决方案1】:

使用嵌套列表推导:

mylist = [y for x in range(1, 4) for y in ([x], [x * 2])]
print(mylist)

结果:

[[1], [2], [2], [4], [3], [6]]

【讨论】:

  • [[(y, y)] for x in range(1, 4) for y in (x, x * 2)] 用于 OP 在其当前编辑中想要的输出。
【解决方案2】:

你可以使用内置的itertools

>>> from itertools import chain

>>> list(chain.from_iterable([[(x, x)], [(x*2, x*2)]] for x in range(1, 4)))
[[(1, 1)], [(2, 2)], [(2, 2)], [(4, 4)], [(3, 3)], [(6, 6)]]

【讨论】:

    【解决方案3】:

    如果您想在不使用 itertools.chain. from_iterable 的情况下使用列表解析来解决此问题,您可以使用嵌套列表解析来解压缩您为每次迭代创建的列表。

    这是[item for sublist in list for item in sublist]

    在这里应用-

    [j for x in range(1, 4) for j in ([(x,x)], [(x*2,x*2)])]
    
    [[(1, 1)], [(2, 2)], [(2, 2)], [(4, 4)], [(3, 3)], [(6, 6)]]
    

    这等效于在 [[(x,x)], [(x*2,x*2)]] 上使用解包运算符 *,但由于这在列表解析中不起作用,因此这是一个很好的方法。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-10-08
      • 1970-01-01
      • 1970-01-01
      • 2015-04-03
      • 2012-12-13
      • 2023-01-27
      相关资源
      最近更新 更多