Apply a function to every item of an arbitrarily nested list

前端 未结 2 529

I have a nested list a = [1, 2, [3, 4], 5] and I want to apply a function that will raise every number to the power of 2. The result will be like this:



        
相关标签:
2条回答
  • 2021-01-15 01:26

    You are decomposing your list into its elements -some of them are lists which can not be multiplied with itself ([3,4]*[3,4]).

    Not sure if that is smart - but you can use a "recursing" lambda:

    a =[1, 2, [3, 4], 5]
    
    l = lambda x : x * x if isinstance(x,int) else list(map(l,x))
    a = list(map(l, a))
    
    print(a)
    

    Output:

    [1, 4, [9, 16], 25]
    

    Works also for "deeper" levels:

    a =[1, 2, [3, [7,8], 4], 5]
    

    Output:

    [1, 4, [9, [49, 64], 16], 25]
    

    but will crash if you mix non-iterables things into the mix

    0 讨论(0)
  • 2021-01-15 01:29

    You probably need a recursive function that distinguishes between lists and scalars:

    def square(item):
        if isinstance(item, list):
            return [square(x) for x in item]
        else:
            return item * item
    
    square(a)
    #[1, 4, [9, 16], 25]
    

    Incidentally, this approach works for arbitrary-nested lists.

    Here's a more general solution:

    def apply(item, fun):
        if isinstance(item, list):
            return [apply(x, fun) for x in item]
        else:
            return fun(item)
    
    apply(a, lambda x: x * x)
    #[1, 4, [9, 16], 25]
    
    0 讨论(0)
提交回复
热议问题