24
votes

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?

Thanks

8
You ask that already less than one hour ago. - Andreas Jung
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? - jsbueno
@Sentinel: Not strict duplicate, because does not involve numpy. But perhaps close enough. Thanks - eat
This isn't a duplicate of the referenced question at all. The solutions for list and numpy.array are entirely different. - pillmuncher
@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. - Double AA

8 Answers

20
votes

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
67
votes

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.

6
votes

Something like:

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

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

List comprehensions for the win :)

1
votes

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)
0
votes

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]]
0
votes

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]]

-1
votes

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] ]