Search code examples
pythonarraysone-liner

OneLiner explanation - Python


I have a task in LeetCode called 832. Flipping an Image

Given an n x n binary matrix image, flip the image horizontally, then invert it, and return the resulting image.

To flip an image horizontally means that each row of the image is reversed.

For example, flipping [1,1,0] horizontally results in [0,1,1]. To invert an image means that each 0 is replaced by 1, and each 1 is replaced by 0.

For example, inverting [0,1,1] results in [1,0,0].

Example 1:

Input: image = [[1,1,0],[1,0,1],[0,0,0]]

Output:[[1,0,0],[0,1,0],[1,1,1]]

Explanation:

First reverse each row: [[0,1,1],[1,0,1],[0,0,0]].
Then, invert the image:[[1,0,0],[0,1,0],[1,1,1]]

and the solution provided by someone is a one-liner in Python:

class Solution:
def flipAndInvertImage(self, image: List[List[int]]) -> List[List[int]]:
    return [[1 ^ i for i in reversed(row)] for row in image]

And debugging the one-liner is not effective at all so my kind request is to explain blow-by-blow the code. Mostly I have problems with those parts before for loop as I couldn't find an explanation on the internet that you can put a code before the loop.


Solution

  • class Solution:
    

    Defines the Class solution

    def flipAndInvertImage(self, image: List[List[int]]) -> List[List[int]]:
    

    Defines the flipAndInvertImage function with one Argument of a list of lists of integers, and the Output of the Same type.

    Okay now the oneliner:

    return [[1 ^ i for i in reversed(row)] for row in image]
    

    This is called a generator expression, where in

    a = [int(i) for i in list_of_strings]
    

    for example, you Loop over list_of_strings and then apply the function int() to it. It's rougly similar to doing this:

    a = []
    for i in list_of_strings:
        a.append(int(i))
    

    So [[...] for row in image] ist the First Generator expression and makes the variable row loop over the rows inside the Image array.

    [1 ^ i for i in reversed(row)] is the second/inner generator. It loops over the variable row given by the outer generator, reverses it using the reverse() function, and then applies a binary x-or operation to it. All 1 ^ i does, is make ones into zeros and zeros into ones.