Я пытаюсь выяснить, есть ли способ получить логический список через сравнение в Python 3. В основном я хочу ввести это
x = [1, 2, 3, 4, 5, 6, 7, 8, 9]
xlist = 4 <= x
и то, что я ищу для вывода, - это список, который будет выглядеть как
xlist = [False, False, False, True, True, True, True, True, True]
Есть ли способ сделать это просто без использования понимания списка, например
xlist = [4 <= i for i in x]
Есть ли что-то более эффективное с большими списками?
Подход к карте, скорее всего, будет быстрее, но, пожалуйста, профайл, если вы действительно хотите знать.
Также рассмотрим модуль массива.
In [2]: %timeit map(lambda i: 4<=i, xrange(1,100))
100000 loops, best of 3: 15.9 us per loop
In [7]: %timeit list(4<=i for i in range(1,100))
100000 loops, best of 3: 10.3 us per loop
In [8]: %timeit list(4<=i for i in range(1,1000))
10000 loops, best of 3: 80.6 us per loop
In [10]: %timeit map(lambda i: 4<=i, xrange(1,1000))
10000 loops, best of 3: 155 us per loop
Нет ничего плохого в понимании списка. Это именно то, что предназначалось для списка вещей.
Если вы используете NumPy (или SciPy), синтаксис, который вы ищете, действительно работает:
from numpy import array
...
x = array([1,2,3,4,5,6,7,8,9])
xlist = 4<=x
Но если у вас нет веских оснований использовать NumPy, это не стоит приносить его только для этого синтаксиса. В любом случае, подумайте об этом, я не уверен, работает ли NumPy на Python 3.
Можно подумать, нужен ли вам промежуточный список или нет. Если вместо этого не использовать выражение генератора. Например, all(i <= 4 for i in x)
будет значительно быстрее и будет использовать меньше памяти, чем all([i <= 4 for i in x])
.
Вы также можете использовать следующее:
print map(lambda i: 4<=i, xrange(1,10))
Для больших списков это:
>>> (4<=i for i in range(1,10))
<generator object <genexpr> at 0xb75beedc>
>>> list(_)
[False, False, False, True, True, True, True, True, True]
# The list(_) is just to show what is inside the generator...
лучше, чем:
>>> [4<=i for i in range(1,10)]
[False, False, False, True, True, True, True, True, True]
Как я понимаю, гораздо меньше преимуществ в сравнении с пониманием списка и пониманием генератора в Python 3 и Python 2. Этот синтаксис работает с обоими, а преимущество для большого списка одинаково: все элементы списка сгенерированный сразу по генератору при необходимости.
Я думаю, что вы уже делаете это правильно.