Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to apply a function to each sublist of a list in python?

Lets say I have a list like this:

list_of_lists = [['how to apply'],['a function'],['to each list?']]

And I have a function let's say I want to apply the F function to each sublist of the F function can compute some score about two lists. How can apply this F function to each list of list_of_lists and return each score in a new list like this:

new_list = [score_1, score_2, score_3]

I tried with the map function the following:

map(F, list_of_lists).append(new_list)
like image 604
skwoi Avatar asked May 05 '15 18:05

skwoi


2 Answers

Map is your friend! map takes a function and an iterable (list, for example) and applies the function on each element of the list.

map(len, [['how to apply'],['a function'],['to each list?']]) 

Output

[1, 1, 1]

If you wanted to do more granular calculation on elements of the sublist, you can nest the map:

map(lambda x: map(lambda y: y + 1, x), [[1], [1, 2], [1, 2, 3]])

Output

[[2], [2, 3], [2, 3, 4]]

Another possible approach (also from functional programming) are list comprehensions. List comprehension is a way of constructing a list from iterable in Python. The syntax is [element for element in iterable]. Any computation can be done on the element, so

[f(element) for element in iterable]

means that the resulting list will be a list of elements, where each element is the result of function f. Like map, list comprehension can be further nested, resulting in a nested element function application.

[element + 1 for element in el] for el in [[1], [1, 2], [1, 2, 3]]]

Output

[[2], [2, 3], [2, 3, 4]]
like image 107
mpolednik Avatar answered Sep 17 '22 18:09

mpolednik


You can use the builtin map to do this.

So if the function you want to apply is len, you would do:

>>> list_of_lists = [['how to apply'],['a function'],['to each list?']]
>>> map(len, list_of_lists)
[1, 1, 1]

In Python3, the above returns a map iterator, so you will need an explicit list call:

>>> map(len, list_of_lists)
<map object at 0x7f1faf5da208>
>>> list(map(len, list_of_lists))
[1, 1, 1]

If you are looking to write some code for this which has to be compatible in both Python2 and Python3, list comprehensions are the way to go. Something like:

[apply_function(item) for item in list_of_lists]

will work in both Python 2 and 3 without any changes.

However, if your input list_of_lists is huge, using map in Python3 would make more sense because the iterator will be much faster.

like image 41
Anshul Goyal Avatar answered Sep 17 '22 18:09

Anshul Goyal