Можно ли использовать "еще" в понимании списка Python?
Вот код, который я пытался превратить в понимание списка:
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)
6 ответов
Синтаксис 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))
Чтобы использовать else
в списках в программировании на Python вы можете попробовать приведенный ниже фрагмент кода. Это решит вашу проблему, фрагмент протестирован на python 2.7 и python 3.5.
obj = ["Even" if i%2==0 else "Odd" for i in range(10)]
Да 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
( нет понимания кортежей).
Дальнейшее чтение:
Если вы хотите 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))
Отличные ответы, но я просто хотел упомянуть о том, что ключевое слово "pass" не будет работать в части 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
Поэтому старайтесь избегать пропусков в списках
Кроме того, я был бы прав в заключении, что понимание списка - самый эффективный способ сделать это?
Может быть. Понимание списка не является по сути вычислительно эффективным. Это все еще работает в линейном времени.
Из моего личного опыта: я значительно сократил время вычислений при работе с большими наборами данных, заменив представления списков (в частности, вложенные) структурами типа for-loop / добавления к списку, которые вы имели выше. В этом приложении я сомневаюсь, что вы заметите разницу.