Итерация по вложенному списку для получения минимального и максимального значений без учета NoneType

Мне нужно найти минимальное и максимальное значения в транспонированном вложенном списке, игнорируя любые типы none.

Это вложенный список, который у меня есть:

x = [[1, 20, 50],
     [5, 6, 7],
     [11, 42, 2],
     [7, 32, None]]

Я хочу игнорировать None в третьем столбце и ожидаю получить следующий результат:

min
[1, 6, 2]

max
[11,42,50]

Мне нужно сделать это, используя стандартную библиотеку python


person Jamie Cook    schedule 25.04.2019    source источник
comment
Что ты уже испробовал ?   -  person ma3oun    schedule 25.04.2019
comment
моя идея заключалась в том, чтобы использовать что-то вроде: min_x = [min(col) for col in zip(*list)]   -  person Jamie Cook    schedule 25.04.2019
comment
Но я получаю ошибку типа. Если я создам новый вложенный список с удаленным None, я не могу найти способ найти минимум/максимум для последнего столбца   -  person Jamie Cook    schedule 25.04.2019
comment
Транспонируйте вложенный список и удалите None из каждого столбца, прежде чем брать min   -  person Boris    schedule 25.04.2019


Ответы (1)


Чистое решение для Python:

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 с приведением к float для автоматического преобразования 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])
person awesoon    schedule 25.04.2019