What is not working with my "map" usage?

Victor vhnguyenn at yahoo.com
Sat Sep 22 18:04:50 EDT 2018


On Saturday, September 22, 2018 at 12:20:08 PM UTC-7, Thomas Jollans wrote:
> On 22/09/2018 20:18, Victor via Python-list wrote:
> > On Saturday, September 22, 2018 at 6:22:32 AM UTC-7, Peter Otten wrote:
> >> Victor via Python-list wrote:
> >>
> >>> Let me use a different input args and display them below.  Basically, I am
> >>> hoping to add up all elements of each nested list.  So at first it should
> >>> start with [1,11,111] ==> 1+11+111 = 123.  But instead, it appears to take
> >>> the 1st element from each nested list to add up [1,2,3] = 6.   How should
> >>> it be corrected?  Thx.
> >>
> >> I see three options. You can
> >>
> >> (1) use a list comprehension
> >>
> >> [add_all_elements(*sub) for sub in alist]
> >>
> >> (2) replace map() with itertools.starmap()
> >>
> >> list(itertools.starmap(add_all_elements, alist))
> >>
> >> (3) change your function's signature from add_all_elements(*args) to
> >> add_all_elements(args), either by modifying it directly or by wrapping it
> >> into another function
> >>
> >> list(map(lambda args: add_all_elements(*args), alist))
> >>
> >> (3a) My personal preference would be to change the signature and then use
> >> the list comprehension
> >>
> >> def add_all_elements(args): ...
> >> [add_all_elements(sub) for sub in alist]
> > 
> > Hi Peter,
> > Thank you for your suggested solutions.  They all work.  But I just want to know what is wrong with my doing:
> > 
> > list(map(add_all_elements,*alist))
> > 
> > Theoretically, each list element is passed to add_all_elements.  And if my alist is [[1, 11, 111], [2, 22, 222], [3, 33, 333]], then the 1st list element  must be this [1,11,111] passed as args into add_all_elements.
> 
> Now,
> 
>    alist = [[1,11,111], [2,22,222], [3,33,333]]
> 
> so `map(add_all_alements, *alist)` is equivalent to
> 
>    map(add_all_elements,
>        [1,11,111],
>        [2,22,222],
>        [3,33,333])
> 
> According to the docs [1], map(function, iterable, ...)
> 
> "applies function to every item of iterable, yielding the results. If 
> additional iterable arguments are passed, function must take that many 
> arguments and is applied to the items from all iterables in parallel."
> 
> So map takes the first item(s) of the argument(s), and applies the 
> function to them, followed by the second item(s), and so on.
> 
> In other words:
> 
> def map(function, *iterables):
>      for args in zip(iterables):
>          yield function(*args)
> 
> 
> [1] https://docs.python.org/3/library/functions.html#map
> 
> Come to think of it, this suggests a rather silly alternative "solution":
> 
> map(add_all_elements, *zip(*alist))
> 
> > 
> > In other words, the following should have happened:
> > 
> >>>> add_all_elements (*[1,11,111])
> > My args =  (1, 11, 111)
> > 
> > i = 1
> > BEFORE total = 0
> > AFTER total = 1
> > 
> > i = 11
> > BEFORE total = 1
> > AFTER total = 12
> > 
> > i = 111
> > BEFORE total = 12
> > AFTER total = 123
> > 
> > FINAL total = 123
> > 
> > 123
> > 
> > Again, thanks!
> >

Thanks all, I got it now!



More information about the Python-list mailing list