Pure Python Solution:
In [16]: x = [[1, 20, 50],
...: [5, 6, 7],
...: [11, 42, 2],
...: [7, 32, None]]
...:
In [17]: [min((y for y in x if y is not None), default=None) for x in zip(*x)]
Out[17]: [1, 6, 2]
In [18]: [max((y for y in x if y is not None), default=None) for x in zip(*x)]
Out[18]: [11, 42, 50]
Обратите внимание, что для [[None]]
приведенный выше код возвращает [None]
, поскольку нет ни элементов min, ни max. Если вы хотите, чтобы этот код вызывал исключение, просто удалите default=None
. Если вы хотите исключить None
из результирующего списка, просто оберните с пониманием списка, как [z for z in (...) if z is not None]
Numpy решение с кастингом на плаву для автоматического преобразования None в nan:
In [12]: import numpy as np
In [13]: a = np.array(
...: [[1, 20, 50],
...: [5, 6, 7],
...: [11, 42, 2],
...: [7, 32, None]],
...: dtype=np.float)
...:
In [14]: np.nanmin(a, axis=0).astype(np.int)
Out[14]: array([1, 6, 2])
In [15]: np.nanmax(a, axis=0).astype(np.int)
Out[15]: array([11, 42, 50])