Итерация по вложенному списку для получения минимальных и максимальных значений, игнорирующих NoneType - PullRequest
1 голос
/ 25 апреля 2019

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

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

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

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

min
[1, 6, 2]

max
[11,42,50]

Мне нужно сделать это с помощью стандартной библиотеки Python

1 Ответ

2 голосов
/ 25 апреля 2019

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])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...