Можно ли использовать "еще" в понимании списка?

Вот код, который я пытался превратить в понимание списка:

table = ''
for index in xrange(256):
    if index in ords_to_keep:
        table += chr(index)
    else:
        table += replace_with

Есть ли способ добавить выражение else к этому пониманию?

table = ''.join(chr(index) for index in xrange(15) if index in ords_to_keep)

Ответ 1

Синтаксис a if b else c является тернарным оператором в Python, который оценивается как a, если условие b истинно, в противном случае оно равно c. Он может использоваться в заявлениях о понимании:

>>> [a if a else 2 for a in [0,1,0,3]]
[2, 1, 2, 3]

Итак, для вашего примера

table = ''.join(chr(index) if index in ords_to_keep else replace_with
                for index in xrange(15))

Ответ 2

Если вы хотите else, вы не хотите фильтровать понимание списка, вы хотите, чтобы он перебирал все значения. Вы можете использовать true-value if cond else false-value в качестве инструкции вместо этого и удалить фильтр с конца:

table = ''.join(chr(index) if index in ords_to_keep else replace_with for index in xrange(15))

Ответ 3

Чтобы использовать методы else в списках в программировании на языке python, вы можете опробовать приведенный ниже фрагмент. Это решит вашу проблему, фрагмент будет протестирован на python 2.7 и python 3.5.

obj = ["Even" if i%2==0 else "Odd" for i in range(10)]

Ответ 4

Да, else можно использовать в Python внутри понимания list с условным выражением ("троичный оператор"):

>>> [("A" if b=="e" else "c") for b in "comprehension"]
['c', 'c', 'c', 'c', 'c', 'A', 'c', 'A', 'c', 'c', 'c', 'c', 'c']

Здесь круглые скобки "()" просто для того, чтобы подчеркнуть условное выражение, они не обязательно обязательны (приоритет оператора).

Кроме того, несколько выражений могут быть вложенными, что приводит к else большему и более сложному чтению кода:

>>> ["A" if b=="e" else "d" if True else "x" for b in "comprehension"]
['d', 'd', 'd', 'd', 'd', 'A', 'd', 'A', 'd', 'd', 'd', 'd', 'd']
>>>

На связанной ноте, понимание может также содержать свое условие if в конце:

>>> ["A" if b=="e" else "c" for b in "comprehension" if False]
[]
>>> ["A" if b=="e" else "c" for b in "comprehension" if "comprehension".index(b)%2]
['c', 'c', 'A', 'A', 'c', 'c']

Состояние с? Да, многократная, if возможно, и на самом деле множественным for с, тоже:

>>> [i for i in range(3) for _ in range(3)]
[0, 0, 0, 1, 1, 1, 2, 2, 2]
>>> [i for i in range(3) if i for _ in range(3) if _ if True if True]
[1, 1, 2, 2]

(Единственное подчеркивание _ является допустимым именем переменной (идентификатором) в Python, используется здесь только для того, чтобы показать, что оно на самом деле не используется. Это имеет особое значение в интерактивном режиме)

Использование этого для дополнительного условного выражения возможно, но бесполезно:

>>> [i for i in range(3)]
[0, 1, 2]
>>> [i for i in range(3) if i]
[1, 2]
>>> [i for i in range(3) if (True if i else False)]
[1, 2]

Понимания также могут быть вложенными для создания "многомерных" списков ("массивов"):

>>> [[i for j in range(i)] for i in range(3)]
[[], [1], [2, 2]]

И последнее, но не менее важное: понимание не ограничивается созданием list, то есть else и if также может использоваться таким же образом в понимании set:

>>> {i for i in "set comprehension"}
{'o', 'p', 'm', 'n', 'c', 'r', 'i', 't', 'h', 'e', 's', ' '}

и dictionary понимания:

>>> {k:v for k,v in [("key","value"), ("dict","comprehension")]}
{'key': 'value', 'dict': 'comprehension'}

Тот же синтаксис также используется для выражений генератора:

>>> for g in ("a" if b else "c" for b in "generator"):
...     print(g, end="")
...
aaaaaaaaa>>>

который может быть использован для создания tuple (нет понимания кортежа).


Дальнейшее чтение:

Ответ 5

Отличные ответы, но просто хотел упомянуть о том, что ключевое слово "передать" не будет работать в if/else части понимания списка (как указано в примерах, упомянутых выше).

#works
list1 = [10, 20, 30, 40, 50]
newlist2 = [x if x > 30 else x**2 for x in list1 ]
print(newlist2, type(newlist2))

#but this WONT work
list1 = [10, 20, 30, 40, 50]
newlist2 = [x if x > 30 else pass for x in list1 ]
print(newlist2, type(newlist2))

Это проверено и проверено на python 3.4. Ошибка следующая:

newlist2 = [x if x > 30 else pass for x in list1 ]                                    
SyntaxError: invalid syntax

Итак, старайтесь избегать использования pass-es в списках

Ответ 6

Кроме того, должен ли я быть прав, заключая, что понимание списка является наиболее эффективным способом для этого?

Может быть. Перечисления списков не являются по своей сути эффективными с точки зрения вычислений. Он по-прежнему работает в линейном режиме.

Из моего личного опыта: Я значительно сократил время вычислений при работе с большими наборами данных, заменив схемы списка (в частности, вложенные) на структуры типа for-loop/list-appending, которые вы указали выше. В этом приложении я сомневаюсь, что вы заметите разницу.