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

Другие вопросы по тегам