43

Possible Duplicate:
How can I turn a list into an array in python?

How can I turn a list such as:

data_list = [0,1,2,3,4,5,6,7,8]

into a list of lists such as:

new_list = [ [0,1,2] , [3,4,5] , [6,7,8] ]

ie I want to group ordered elements in a list and keep them in an ordered list. How can I do this?

10
  • 4
    You ask that already less than one hour ago. Commented Jul 7, 2011 at 17:55
  • 1
    Sorry - I can't figure out the criterium for defining the subgroups on yur question. In your example, all numbers are "ordered" - so do you want ordered elements AND subgroups of max-lenght 3? Or just lenght 3 for each subgroup? Commented Jul 7, 2011 at 17:56
  • 1
    @Sentinel: Not strict duplicate, because does not involve numpy. But perhaps close enough. Thanks Commented Jul 7, 2011 at 17:58
  • 4
    This isn't a duplicate of the referenced question at all. The solutions for list and numpy.array are entirely different. Commented Jul 7, 2011 at 18:05
  • 4
    @Sentinel: You're correct that it is similar but I needed to use lists and not arrays now. When I used the np.reshape method from the previous question to revert back to a 1D array, I lost all internal grouping -- my data was not simply [1,2,3...] but a lot of 3-tuples. I needed a way to put back the organization into threes not using arrays. I think this question is thus useful on its own merit and is significantly different than the previous one. Commented Jul 7, 2011 at 18:08

9 Answers 9

90

This groups each 3 elements in the order they appear:

new_list = [data_list[i:i+3] for i in range(0, len(data_list), 3)]

Give us a better example if it is not what you want.

Sign up to request clarification or add additional context in comments.

1 Comment

I ran into a similar situation to the above question and your code worked perfect! I've been struggling at the last stage. So glad that I could address this.
23

This assumes that data_list has a length that is a multiple of three

i=0
new_list=[]
while i<len(data_list):
  new_list.append(data_list[i:i+3])
  i+=3

Comments

8

Something like:

map (lambda x: data_list[3*x:(x+1)*3], range (3))

Comments

5

Based on the answer from Fred Foo, if you're already using numpy, you may use reshape to get a 2d array without copying the data:

import numpy
new_list = numpy.array(data_list).reshape(-1, 3)

1 Comment

I like this, but it only works when the array has a number of elements that's a multiple of 3, otherwise it will throw a ValueError.
4

new_list = [data_list[x:x+3] for x in range(0, len(data_list) - 2, 3)]

List comprehensions for the win :)

Comments

2

The following function expands the original context to include any desired list of lists structure:

def gen_list_of_lists(original_list, new_structure):
    assert len(original_list) == sum(new_structure), \
    "The number of elements in the original list and desired structure don't match"
        
    list_of_lists = [[original_list[i + sum(new_structure[:j])] for i in range(new_structure[j])] \
                     for j in range(len(new_structure))]
        
    return list_of_lists

Using the above:

data_list = [0,1,2,3,4,5,6,7,8]
    
new_list = gen_list_of_lists(original_list=data_list, new_structure=[3,3,3])
# The original desired outcome of [[0,1,2], [3,4,5], [6,7,8]]

new_list = gen_list_of_lists(original_list=data_list, new_structure=[2,3,3,1])
# [[0, 1], [2, 3, 4], [5, 6, 7], [8]]

Comments

0

The below one is more optimized and quite straightforward.

data_list = [0,1,2,3,4,5,6,7,8]
result =[]
i=0
while i <(len(data_list)-2):
    result.append(data_list[i:i+3])
    i+=3
print(result)

**output**

[[0, 1, 2], [3, 4, 5], [6, 7, 8]]

3 Comments

I fixed the code. lots of errors. However, I am not sure if this solves the problem. downvoting the answer.
@JoeFerndz can i know what you have fixed in this ? have you run the code?
Because I remember writing the working code. What changes have you done?
0

Here is a generalized solution

import math

data_list = [0,1,2,3,4,5,6,7,8]
batch_size=3

n_batches=math.ceil(len(data_list)/batch_size)

[data_list[x*batch_size:min(x*batch_size+batch_size,len(data_list))] 
    for x in range(n_batches)]

It works even if the last sublist is not the same size as the rest (<batch_size)

Comments

-1

Do you have any sort of selection criteria from your original list?

Python does allow you to do this:

new_list = []
new_list.append(data_list[:3])
new_list.append(data_list[3:6])
new_list.append(data_list[6:])

print new_list
# Output:  [ [0,1,2] , [3,4,5] , [6,7,8] ]

2 Comments

FWIW, this won't be very practical one, when you try to generalize the pattern OP described. Thanks
Oh I didn't know if the OP was wondering if embedded lists were possible in Python or if there was a way to convert a list into one.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.