Python在列表二维矩阵列表中设置一列

时间:2018-10-08 09:59:50

标签: python list matrix tuples

因此有两个列表

y_new = (   165,     152,     145,    174)
pos_2D  = ( (2,3), (32,52), (73,11), (43,97) )

我想这样

pos_2D_new = setCol(2, y_new, pos_2D)

其中第2列是Y坐标。

pos_2D_new = ( (2,165), (32,152), (73,145), (43,174) )

如何在Python中将1D设置为2D元组?

3 个答案:

答案 0 :(得分:2)

您可以将生成器表达式与zip一起使用:

pos_2D_new = tuple((x, y) for (x, _), y in zip(pos_2D, y_new))

使用示例输入,pos_2D_new将变为:

((2, 165), (32, 152), (73, 145), (43, 174))

答案 1 :(得分:1)

您可以执行以下操作:

pos_2D_new = [ (x, y2) for (x, _), y2 in zip(pos_2D, y_new) ]

或者如果您想要一个元组:

pos_2D_new = tuple((x, y2) for (x, __), y2 in zip(pos_2D, y_new))

因此,我们同时遍历pos_2Dynew,并且每次构造新的元组(x, y2)时都如此。

上面的内容当然不是很通用,我们可以使其更通用,并允许指定要替换的项目,例如:

def replace_coord(d, old_pos, new_coord):
    return tuple(x[:d] + (y,) + x[d+1:] for x, y in zip(old_pos, new_coord))

因此对于 x 坐标,您可以使用replace_coord(0, old_pos, new_x_coord),而对于 y 坐标,则为replace_coord(1, old_pos, new_y_coord)。这也适用于三个或更多个维度的坐标。

答案 2 :(得分:0)

愿意给

def setCol(idx, coords_1d, coords_nd):
    # recalling that indexing starts from 0
    idx -= 1
    return [
        c_nd[:idx] + (c_1d,) + c_nd[idx+1:]
        for (c_1d, c_nd) in zip(coords_1d, coords_nd)
    ]

>>> setCol(2, y_new, pos_2D)
[(2, 165), (32, 152), (73, 145), (43, 174)]