格式化一个嵌套列表样式以匹配另一个列表

时间:2018-04-23 16:37:09

标签: python list numpy matplotlib nested-lists

我有xy坐标,我试图在matplotlib中匹配长度。我需要x值列表来匹配y值嵌套列表模式,这样图表不会在列表之间画一条线,而是用每个嵌套列表开始和停止。

X(时间):

[0.0, 1.0, 2.0, 3.0, 4.0, 5.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0, 11.0, 12.0, ...]

Y(相)

[[1.0, 1.0, 1.0, 1.0, 1.0, 1.0], [2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, ...]]

列表长度会有所不同,每个嵌套列表的长度也会有所不同。

2 个答案:

答案 0 :(得分:1)

如果您的列表是锯齿状的(假设元素总数相等),您可以迭代y,在迭代时从x创建块。

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

curi = 0
fin = []
for i in y:
  fin.append(x[curi:curi+len(i)])
  curi += len(i)

print(fin)

输出:

[[2, 2, 2], [2, 2, 2, 2], [2, 2, 2, 2, 2], [2, 2, 2, 2, 2, 2, 2, 2, 2, 2], [2, 2, 2, 2, 2, 2, 2, 2]]

如果你列出锯齿状:

x.reshape(y.shape)

答案 1 :(得分:0)

您可以使用np.split,它会在作为第二个参数提供的索引处分解数组或列表:

# create random example
>>> y = [list(np.random.randint(0, 10, (np.random.randint(3, 10),))) for j in range(10)]
>>> x = list(np.random.randint(0, 10, (sum(map(len, y)),)))
>>> y
[[6, 8, 4, 5], [1, 3, 6, 3, 7, 8], [1, 5, 9, 6, 4], [2, 7, 3], [8, 3, 6, 8], [0, 6, 4, 4, 6, 9], [5, 4, 8, 3, 8, 1], [6, 4, 7, 2], [2, 1, 0], [2, 2, 5, 7]]
>>> x
[6, 7, 3, 4, 1, 4, 4, 8, 2, 7, 0, 9, 8, 7, 9, 9, 6, 0, 5, 5, 2, 2, 5, 5, 4, 4, 5, 4, 2, 1, 4, 5, 3, 5, 0, 4, 7, 0, 4, 3, 3, 7, 7, 5, 3]

# split
>>> xs = np.split(x, np.cumsum(np.fromiter(map(len, y), int, count=len(y)-1)))
>>> xs
[array([6, 7, 3, 4]), array([1, 4, 4, 8, 2, 7]), array([0, 9, 8, 7, 9]), array([9, 6, 0]), array([5, 5, 2, 2]), array([5, 5, 4, 4, 5, 4]), array([2, 1, 4, 5, 3, 5]), array([0, 4, 7, 0]), array([4, 3, 3]), array([7, 7, 5, 3])]