学习 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]]])
然后根据需要切片。
我有一个列表列表,嵌套列表中有元组(代表 (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]]])
然后根据需要切片。