Можно ли использовать "еще" в понимании списка?
Вот код, который я пытался превратить в понимание списка:
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, которые вы указали выше. В этом приложении я сомневаюсь, что вы заметите разницу.