学习 python 和处理列表

Learning python and dealing with lists

我有一个列表列表,嵌套列表中有元组(代表 (x,y) 坐标)。我希望嵌套列表代表一个 bin。最后,我想将这些数据放入 Mathematica。这就是为什么我要生成这样的点。

list_of_list = [[(2,1),(4,2),(3,1)], [(1,1),(2,2),(4,3)]]

我想将 x 坐标和 y 坐标分开,但我将每个嵌套列表分为两堆不同的框(回指两个不同的箱子)。所以,本质上,我想绘制方框。此外,在我的实际代码中,我生成了 N 个框,因此我将处理多个嵌套列表。

我怎样才能让它像这样:

x = [[2,4,3],[1,2,4]]

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

第 1 步:

>>> x = [[l[0] for l in  m] for m  in list_of_list]
>>> x
[[2, 4, 3], [1, 2, 4]]
>>> y = [[l[1] for l in  m] for m  in list_of_list]
>>> y
[[1, 2, 1], [1, 2, 3]]
>>> 

您可以使用 zip 和可迭代解包:

list_of_list = [[(2,1),(4,2),(3,1)], [(1,1),(2,2),(4,3)]]
x, y = zip(*(zip(*item) for item in list_of_list))
print(x)
print(y)

输出

((2, 4, 3), (1, 2, 4))
((1, 2, 1), (1, 2, 3))

你的问题的第二部分很不清楚,(i) 最好专注于单个 question/problem 和 (ii) 第一部分有可能是 XY 问题 - 即如果你清楚最终目标是,可能有更好的方法不需要第一步。

你可以定义一个按坐标分组的方法,这有点冗长但不言自明,例如:

def group_by_x_and_y(points):
    xs = [x for x, _ in points]
    ys = [y for _, y in points]
    return xs, ys

所以,如果你调用 group_by_x_and_y(list_of_list[0]),你会得到

#=> [[2, 4, 3], [1, 2, 1]]

那么你可以这样使用得到需要的结果:

xs, ys = group_by_x_and_y([group_by_x_and_y(coords) for coords in list_of_list])
xss #=> [[2, 4, 3], [1, 2, 4]]
yss #=> [[1, 2, 1], [1, 2, 3]]

另一种选择是使用 Numpy,这不是 OP 所要求的,但也许可以给出进一步的提示:

import numpy as np
coords = np.array(list_of_list)
np.transpose(coords)

#array([[[2, 1],
#        [4, 2],
#        [3, 4]],
#
#       [[1, 1],
#        [2, 2],
#        [1, 3]]])

然后根据需要切片。