如何在 Python 中执行此特定列表理解?

How to do this specific list comprehension in Python?

points = [
    [[x,y], [x,y], [x,y]],
    [[x,y], [x,y], [x,y], [x,y], [x,y]],
    [[x,y]]
]

weights = [1, 2, 3]

output  = [
    [[x,y,1], [x,y,1], [x,y,1]],
    [[x,y,2], [x,y,2], [x,y,2], [x,y,2], [x,y,2]],   
    [[x,y,3]]
]

我想结合点和权重最终看起来像输出列。点和权重的长度将始终相同。但是,[x,y] 对的数量对于列表中的每个列表都是不同的。正是我如何展示这个例子。 Python 是我使用的语言。

如有任何帮助,我们将不胜感激

使用zip相对容易:

[[p+[w] for p in pl] for pl, w in zip(points, weights)]

在不使用 zip 的情况下尝试这种单行列表理解 -

[[k+[weights[i]] for k in j] for i,j in enumerate(points)]

由内而外的工作。

在里面,我们有[[x, y], [x, y], [x, y]]1,我们要产生[[x, y, 1], [x, y, 1], [x, y, 1]]

因此,我们将 1 附加到每个 [x, y] 值。但是.append就地修改了一个值和returnsNone;要使用列表理解,我们需要 return 新值。因此,我们可以从输入 1 创建 [1],并将列表与 +.

连接起来

因此,我们想要给定的内部 item+ 一个附加列表 [1]for 找到的每个 itemin 我们的原始数据 ([[x, y], [x, y], [x, y]])。由于我们要将其应用于嵌套列表,假设我们将该列表称为 row。然后,我们编写列表理解,描述该任务——完全按照我所说的,从左到右阅读:[item + [1] for item in row].

(编辑:如其他答案所述,它也可以利用解包:我们可以 [*item, 1] 而不是 item + [1]。)

现在:这就是我们想要对每个 row 进行的那种处理。但是我们想每次都使用不同的值而不是 1。这些值来自 weights,我们希望与整体 points.

row 并行迭代

因此,我们需要使用 zip 来将 weights 中的每个 weightpoints 中相应的 row 配对。这看起来像 zip(points, weights),当我们迭代它时,我们得到 (row, weight) 对。

我们对给定 row 的处理现在看起来像 [item + [weight] for item in row],在修改它以考虑变化的 weight.

之后

所以我们再次应用该技术:我们想做 [item + [weight] for item in row]for 每个 (row, weight) 对(这里括号不是绝对必要的,但会使事情变得容易得多理解)发现 in 我们的 zipped 列表 pointsweights。再一次,我们从左到右阅读:

[[item + [weight] for item in row] for (row, weight) in zip(points, weights)]