Using map() function with keyword arguments

24,638

Solution 1

Use functools.partial():

from functools import partial

mapfunc = partial(my_function, ip=ip)
map(mapfunc, volume_ids)

partial() creates a new callable, that'll apply any arguments (including keyword arguments) to the wrapped function in addition to whatever is being passed to that new callable.

Solution 2

Here is a lambda approach (not better, just different)

volume_ids = [1,2,3,4,5]
ip = '172.12.13.122'
map(lambda ids: my_function(ids, ip), volume_ids);

Solution 3

This can be done easily with a list comprehension.

volume_ids = [1,2,3,4,5]
ip = '172.12.13.122'
results = [my_function(i,ip=ip) for i in volume_ids]

Solution 4

In general, one can use map to pass keywords to a function by wrapping that function in something which unpacks a dictionary, and then passing an iterable of dictionaries to map. Example:

from itertools import product

volume_ids = [1,2,3,4,5]
volume_ids = (("volume_id", volume_id) for volume_id in volume_ids)
ips = [("ip", '172.12.13.122')]
kwargs_iterable = map(dict, product(volume_ids, ips))

result = map(lambda kwargs: my_function(**kwargs), kwargs_iterable)

For your special case, however, a simpler solution would be:

map(my_function, volume_ids, [ip]*len(volume_ids))

This is concise and does not rely on any imports. Another possibility could be to combine product and starmap from itertools:

from itertools import product, starmap

ips = [ip]
starmap(my_function, product(volume_ids, ips))

This generalizes nicely to the setting with more than one ip adress, or more than two variables.

Share:
24,638

Related videos on Youtube

Cameron Sparr
Author by

Cameron Sparr

Updated on July 09, 2022

Comments

  • Cameron Sparr
    Cameron Sparr almost 2 years

    Here is the loop I am trying to use the map function on:

    volume_ids = [1,2,3,4,5]
    ip = '172.12.13.122'
    for volume_id in volume_ids:
        my_function(volume_id, ip=ip)
    

    Is there a way I can do this? It would be trivial if it weren't for the ip parameter, but I'm not sure how to deal with that.

  • Jason Sperske
    Jason Sperske over 11 years
    partials are faster, lambdas support out of order arguments
  • mleger45
    mleger45 about 8 years
    The problem is that we want to avoid the for loop
  • Armin Rigo
    Armin Rigo about 8 years
    Why? Because it's clearer? Or because of some misconception like "for loops are slow in Python"?
  • mleger45
    mleger45 about 8 years
    Yes, I would say indeed is clearer, more Pythonish, and map function is meant to perform the laziest iteration posible. Besides, we need a list back, so map would perform it better for us than writing more lines coding a for loop
  • aydow
    aydow over 3 years
    This has side effects. You are assigning a bunch of memory that may not be desired (and wasn't specified by OP).