Project Euler 11: Largest product in a grid, Python3
One of the potential improvements would be to extract the logic of generating the 4 numbers in each of the directions (let's even generalize it for k numbers). What if we would create a generator that would do this for an arbitrary square matrix and k input numbers:

def generate_adjacent_items(grid, k):
    """
    For a square grid, generates lists of all possible k numbers in every direction 
    (up, down, left, right and diagonally).
    """
    size = len(grid)
    for row in range(size):
        for col in range(size):
            # left -&gt; right
            if row + k - 1 &lt; size:
                yield [grid[row + index][col] for index in range(k)]

            # top -&gt; bottom
            if col + k - 1 &lt; size:
                yield [grid[row][col + index] for index in range(k)]

            # diagonal: top-left -&gt; bottom-right
            if row + k - 1 &lt; size and col + k - 1 &lt; size:
                yield [grid[row + index][col + index] for index in range(k)]

            # diagonal: bottom - left -&gt; top - right
            if row - k + 1 &gt;= 0 and col + k - 1 &lt; size:
                yield [grid[row - index][col + index] for index in range(k)]


(please recheck for off-by-ones)

Then, you can iterate over the generator and get your maximum number, e.g.:

from operator import mul
from functools import reduce

K = 4

# list_ints and generate_adjacent_items function definitions here

if __name__ == '__main__':
    sub_lists = generate_adjacent_items(list_ints(), K)

    max_sublist = max(sub_lists, key=lambda x: reduce(mul, x))
    print(max_sublist, reduce(mul, max_sublist))


Note that I'm using functools.reduce(), operator.mul and the built-in max() to determine the maximum of the multiplications, but you can do it "manually" the way you were doing it in your presented solution.

For the provided sample input, it prints:

[87, 97, 94, 89] 70600674