如何在 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
找到的每个 item
in
我们的原始数据 ([[x, y], [x, y], [x, y]]
)。由于我们要将其应用于嵌套列表,假设我们将该列表称为 row
。然后,我们编写列表理解,描述该任务——完全按照我所说的,从左到右阅读:[item + [1] for item in row]
.
(编辑:如其他答案所述,它也可以利用解包:我们可以 [*item, 1]
而不是 item + [1]
。)
现在:这就是我们想要对每个 row
进行的那种处理。但是我们想每次都使用不同的值而不是 1
。这些值来自 weights
,我们希望与整体 points
.
的 row
并行迭代
因此,我们需要使用 zip
来将 weights
中的每个 weight
与 points
中相应的 row
配对。这看起来像 zip(points, weights)
,当我们迭代它时,我们得到 (row, weight)
对。
我们对给定 row
的处理现在看起来像 [item + [weight] for item in row]
,在修改它以考虑变化的 weight
.
之后
所以我们再次应用该技术:我们想做 [item + [weight] for item in row]
、for
每个 (row, weight)
对(这里括号不是绝对必要的,但会使事情变得容易得多理解)发现 in
我们的 zip
ped 列表 points
和 weights
。再一次,我们从左到右阅读:
[[item + [weight] for item in row] for (row, weight) in zip(points, weights)]
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
找到的每个 item
in
我们的原始数据 ([[x, y], [x, y], [x, y]]
)。由于我们要将其应用于嵌套列表,假设我们将该列表称为 row
。然后,我们编写列表理解,描述该任务——完全按照我所说的,从左到右阅读:[item + [1] for item in row]
.
(编辑:如其他答案所述,它也可以利用解包:我们可以 [*item, 1]
而不是 item + [1]
。)
现在:这就是我们想要对每个 row
进行的那种处理。但是我们想每次都使用不同的值而不是 1
。这些值来自 weights
,我们希望与整体 points
.
row
并行迭代
因此,我们需要使用 zip
来将 weights
中的每个 weight
与 points
中相应的 row
配对。这看起来像 zip(points, weights)
,当我们迭代它时,我们得到 (row, weight)
对。
我们对给定 row
的处理现在看起来像 [item + [weight] for item in row]
,在修改它以考虑变化的 weight
.
所以我们再次应用该技术:我们想做 [item + [weight] for item in row]
、for
每个 (row, weight)
对(这里括号不是绝对必要的,但会使事情变得容易得多理解)发现 in
我们的 zip
ped 列表 points
和 weights
。再一次,我们从左到右阅读:
[[item + [weight] for item in row] for (row, weight) in zip(points, weights)]