GeeksforGeeks App
Open App
Browser
Continue

# Python | Convert column to separate elements in list of lists

There are instances in which we might require to extract a particular column of a Matrix and assign its each value as separate entity in list and this generally has a utility in Machine Learning domain. Let’s discuss certain ways in which this action can be performed.
Method #1 : Using list slicing and list comprehension
The functionality of list slicing and comprehension can be clubbed to perform the particular task of extracting a column from a list and then it can be added as new element using list comprehension.

## Python3

 `# Python3 code to demonstrate ``# column to separate elements in list of lists``# using list slicing and list comprehension` `# initializing list of list``test_list ``=` `[[``1``, ``3``, ``4``],``             ``[``6``, ``2``, ``8``],``             ``[``9``, ``10``, ``5``]]` `# printing original list``print` `(``"The original list is : "` `+` `str``(test_list))` `# using list slicing and list comprehension``# column to separate elements in list of lists``res ``=` `[i ``for` `nest_list ``in` `[[j[``1` `: ], [j[``0``]]]``         ``for` `j ``in` `test_list] ``for` `i ``in` `nest_list]` `# printing result``print` `(``"The list after column shift is : "` `+` `str``(res))`

Output

```The original list is : [[1, 3, 4], [6, 2, 8], [9, 10, 5]]
The list after column shift is : [[3, 4], [1], [2, 8], [6], [10, 5], [9]]```

The time complexity of this program is O(n^2) where n is the number of elements in the list of lists.

The auxiliary space complexity of this program is O(n), where n is the number of elements in the list of lists

Method #2 : Using itertools.chain() + list comprehension + list slicing
The above method can be improved by inducing the concept of element chaining and reduce the overhead of the list comprehension and reducing the time taken to execute this particular task.

## Python3

 `# Python3 code to demonstrate ``# column to separate elements in list of lists``# using itertools.chain()+ list comprehension + list slicing``from` `itertools ``import` `chain` `# initializing list of list``test_list ``=` `[[``1``, ``3``, ``4``],``             ``[``6``, ``2``, ``8``],``             ``[``9``, ``10``, ``5``]]` `# printing original list``print` `(``"The original list is : "` `+` `str``(test_list))` `# using itertools.chain() + list comprehension + list slicing``# column to separate elements in list of lists``res ``=` `list``(chain(``*``[``list``((sub[``1``: ], [sub[``0``]]))``                      ``for` `sub ``in` `test_list]))` `# printing result``print` `(``"The list after column shift is : "` `+` `str``(res))`

Output

```The original list is : [[1, 3, 4], [6, 2, 8], [9, 10, 5]]
The list after column shift is : [[3, 4], [1], [2, 8], [6], [10, 5], [9]]```

Time Complexity: O(n*n), where n is the length of the list test_list
Auxiliary Space: O(n) additional space of size n is created where n is the number of elements in the res list

Approach using numpy:

## Note: Install numpy module using command “pip install numpy”

Algorithm:

Initialize the input list of lists, test_list.
Convert the test_list into a NumPy array, arr.
Perform column shift using np.roll() function and save the result in shifted_arr.
Convert the shifted_arr array back to a list of lists, shifted_list.
Initialize an empty list res.
Loop through each sublist of shifted_list and divide them into two sublists, each containing two elements using list slicing.
Append the two sublists to res.
Print the original list and the modified list res.

## Python3

 `import` `numpy as np` `# initializing list of list``test_list ``=` `[[``1``, ``3``, ``4``],``             ``[``6``, ``2``, ``8``],``             ``[``9``, ``10``, ``5``]]` `# convert the list to a NumPy array``arr ``=` `np.array(test_list)` `# shift the columns``shifted_arr ``=` `np.roll(arr, ``-``1``, axis``=``1``)` `# convert the shifted array back to a list of lists``shifted_list ``=` `shifted_arr.tolist()``res``=``[]``for` `i ``in` `shifted_list:``    ``res.extend([i[:``2``], i[``2``:]])``# print the original list and the shifted list``print``(``"The original list is :"``, test_list)``print``(``"The list after column shift is :"``, res)`

Output:
The original list is : [[1, 3, 4], [6, 2, 8], [9, 10, 5]]
The list after column shift is : [[3, 4], [1], [2, 8], [6], [10, 5], [9]]

Time complexity:
The time complexity of the code is O(n^2), where n is the number of elements in the input list of lists. This is due to the loop that is used to split the sublists into smaller sublists.

Auxiliary Space:
The space complexity of the code is also O(n^2), as the input list of lists is converted to a NumPy array and then converted back to a list of lists, which requires additional memory. Additionally, a new list res is created to store the divided sublists.

My Personal Notes arrow_drop_up