Mapping a nested list with List Comprehension in Python?

前端 未结 5 535
自闭症患者
自闭症患者 2020-12-11 03:28

I have the following code which I use to map a nested list in Python to produce a list with the same structure.

>>> nested_list = [[\'Hello\', \'Wo         


        
相关标签:
5条回答
  • 2020-12-11 03:49

    Remember the Zen of Python:

    There is generally more than one -- and probably several -- obvious ways to do it.**

    ** Note: Edited for accuracy.

    Anyway, I prefer map.

    from functools import partial
    nested_list = map( partial(map, str.upper), nested_list )
    
    0 讨论(0)
  • 2020-12-11 03:52

    Map is certainly a much cleaner way of doing what you want. You can nest the list comprehensions though, maybe that's what you're after?

    [[ix.upper() for ix in x] for x in nested_list]
    
    0 讨论(0)
  • 2020-12-11 03:58

    Other posters have given the answer, but whenever I'm having trouble wrapping my head around a functional construct, I swallow my pride and spell it out longhand with explicitly non-optimal methods and/or objects. You said you wanted to end up with a generator, so:

    for xs in n_l:
        def doUpper(l):
            for x in l:
                yield x.upper()
        yield doUpper(xs)
    
    for xs in n_l:
        yield (x.upper() for x in xs)
    
    ((x.upper() for x in xs) for xs in n_l)
    

    Sometimes it's cleaner to keep one of the longhand versions. For me, map and reduce sometimes make it more obvious, but Python idioms might be more obvious for others.

    0 讨论(0)
  • 2020-12-11 04:05

    Here is solution for nested list that has arbitrary depth:

    def map_nlist(nlist=nlist,fun=lambda x: x*2):
        new_list=[]
        for i in range(len(nlist)):
            if isinstance(nlist[i],list):
                new_list += [map_nlist(nlist[i],fun)]
            else:
                new_list += [fun(nlist[i])]
        return new_list
    

    you want to upper case all you list element, just type

    In [26]: nested_list = [['Hello', 'World'], ['Goodbye', [['World']]]]
    In [27]: map_nlist(nested_list,fun=str.upper)
    Out[27]: [['HELLO', 'WORLD'], ['GOODBYE', [['WORLD']]]]
    

    And more important, this recursive function can do more than this!

    I am new to python, feel free to discuss!

    0 讨论(0)
  • 2020-12-11 04:10

    For nested lists you can use nested list comprehensions:

    nested_list = [[s.upper() for s in xs] for xs in nested_list]
    

    Personally I find map to be cleaner in this situation, even though I almost always prefer list comprehensions. So it's really your call, since either will work.

    0 讨论(0)
提交回复
热议问题