Создайте список с логическими значениями, которые представляют результаты предиката при применении к списку

1

Я пытаюсь выяснить, есть ли способ получить логический список через сравнение в 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]

Есть ли что-то более эффективное с большими списками?

  • 4
    Почему вы чувствуете, что понимание списка неэффективно? Список всегда отсортирован? Если нет, то я не вижу, как можно обойти тестирование каждого значения в списке. Понимание списка - эффективный способ сделать это.
Теги:
python-3.x
list-comprehension

6 ответов

2
Лучший ответ

Подход к карте, скорее всего, будет быстрее, но, пожалуйста, профайл, если вы действительно хотите знать.

Также рассмотрим модуль массива.

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
5

Нет ничего плохого в понимании списка. Это именно то, что предназначалось для списка вещей.

Если вы используете NumPy (или SciPy), синтаксис, который вы ищете, действительно работает:

from numpy import array

...

x = array([1,2,3,4,5,6,7,8,9])
xlist = 4<=x

Но если у вас нет веских оснований использовать NumPy, это не стоит приносить его только для этого синтаксиса. В любом случае, подумайте об этом, я не уверен, работает ли NumPy на Python 3.

4

Можно подумать, нужен ли вам промежуточный список или нет. Если вместо этого не использовать выражение генератора. Например, all(i <= 4 for i in x) будет значительно быстрее и будет использовать меньше памяти, чем all([i <= 4 for i in x]).

1

Вы также можете использовать следующее:

print map(lambda i: 4<=i, xrange(1,10))
1

Для больших списков это:

>>> (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. Этот синтаксис работает с обоими, а преимущество для большого списка одинаково: все элементы списка сгенерированный сразу по генератору при необходимости.

0

Я думаю, что вы уже делаете это правильно.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню