Carlos Eduardo Corpus
Carlos Eduardo Corpus

Reputation: 349

Create a 4D list from a 3D list

I'm working with lists and something came up, so let's say I have a 3D list and I want to create a 4D list, so every two positions in the inner lists split, here is what I tried

mylist = [[[0, 2, 1], [0, 3, 1], [0, 4, 3, 1], [0, 4, 3, 1], [0, 3, 2, 1], [0, 2, 3, 4, 1]], 
          [[0, 2, 1], [0, 4, 2, 3, 1], [0, 4, 3, 1], [0, 4, 3, 1], [0, 3, 2, 1], [0, 2, 3, 4, 1]]]

newlist = [mylist[i: i + 2] for i in range(0, len(mylist), 2)]

print(newlist)

newlist = [[[[0, 2, 1], [0, 3, 1], [0, 4, 3, 1], [0, 4, 3, 1], [0, 3, 2, 1], [0, 2, 3, 4, 1]], 
            [[0, 2, 1], [0, 4, 2, 3, 1], [0, 4, 3, 1], [0, 4, 3, 1], [0, 3, 2, 1], [0, 2, 3, 4, 1]]]]

but I was expecting something like:

newlist = [[[[0, 2, 1], [0, 3, 1]], [[0, 4, 3, 1], [0, 4, 3, 1]], [[0, 3, 2, 1], [0, 2, 3, 4, 1]]], 
            [[0, 2, 1], [0, 4, 2, 3, 1]], [[0, 4, 3, 1], [0, 4, 3, 1]], [[0, 3, 2, 1], [0, 2, 3, 4, 1]]]]

I believe I'm missing a for in my list comprehension something like:

newlist = [[mylist[j: j + 2] for j in i] for i in range(0, len(my list), 2)]

but I'm having an error and I can't figure it out what is the problem, so any help will appreciated, thank you so much!

Upvotes: 0

Views: 75

Answers (2)

Riccardo Bucco
Riccardo Bucco

Reputation: 15364

Here is a possible solution. You were very close!

newlist = [[lst[i:i+2] for i in range(0, len(lst), 2)] for lst in mylist]

Upvotes: 1

MrNobody33
MrNobody33

Reputation: 6483

Try this:

newlist=[[list(ls) for ls in zip(i[::2], i[1::2])] for i in mylist]
print(newlist)

Output:

[[[[0, 2, 1], [0, 3, 1]],
  [[0, 4, 3, 1], [0, 4, 3, 1]],
  [[0, 3, 2, 1], [0, 2, 3, 4, 1]]],
 [[[0, 2, 1], [0, 4, 2, 3, 1]],
  [[0, 4, 3, 1], [0, 4, 3, 1]],
  [[0, 3, 2, 1], [0, 2, 3, 4, 1]]]]

Upvotes: 2

Related Questions