Есть ли какая-то оценка выражения в синтаксисе нарезки списков / кортежей в Python? - PullRequest
4 голосов
/ 19 ноября 2011

с массивами numpy вы можете использовать какое-то неравенство в синтаксисе среза квадратной скобки:

>>>arr = numpy.array([1,2,3])
>>>arr[arr>=2]
array([2, 3])

существует ли какой-то эквивалентный синтаксис в обычных структурах данных python? Я ожидал получить ошибку при попытке:

>>>lis = [1,2,3]
>>>lis[lis > 2]
2

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

p.s. Я вообще не смог найти документацию по этому синтаксису, так что если бы кто-то мог указать мне на него для numpy и для обычного python (если он существует), это было бы здорово.

Ответы [ 2 ]

7 голосов
/ 19 ноября 2011

В Python 2.x lis > 2 возвращает True.Это связано с тем, что операнды имеют разные типы, и для этих двух типов не определен оператор сравнения, поэтому он сравнивает имена классов в алфавитном порядке ("list" > "int").Поскольку True совпадает с 1, вы получаете элемент с индексом 1.

В Python 3.x это выражение выдаст вам ошибку (гораздо менее удивительный результат).

TypeError: unorderable types: list() > int()

Чтобы сделать то, что вы хотите, вы должны использовать понимание списка:

[x for x in lis if x > 2]
1 голос
/ 19 ноября 2011

использование списка понимания:

[a for a in lis if a>=2]
...