2016-05-13 5 views
4

Рассмотрите следующий фрагмент кода. Он помещает синтаксическую ошибку в оператор break.Использование тернарного оператора в python?

digits = list(str(102)) 
dummy = list(str(102/2)) 
for j in digits: 
    dummy.remove(j) if j in dummy else break 

Как это исправить (я хочу еще использовать тройной оператор)

+6

'break' - это утверждение, и поэтому он не может * использоваться внутри троичного. Сожалею. –

+0

Я не думаю, что вы можете использовать тернарный оператор для этого случая ... – Ian

+0

Чтобы удалить элемент из списка, вам, вероятно, нужно быть осторожным (безопаснее делать обратный путь). проверьте это: http://stackoverflow.com/questions/35618307/how-to-transform-string-into-dict/35618686#35618686 см. также ответ Padraic – Ian

ответ

5

Edit:

(см мой разговор с Stefan Pochmann в комментариях)

Тернарный оператор не для только оператор, а скорее для назначения или для выражения (и break является только заявления):

a = 5 if cond else 3 #OK 
do() if cond else dont() #also OK 
do() if cond else break #not OK 

использовать нормальное if-else заявление делать заявление:

if cond: 
    do() 
else: 
    break 
+0

Это хорошо, но когда я должен набрать его 5-6 раз, он выглядит уродливым, есть ли обходной путь? – TheChetan

+2

Ваши примеры не совсем то же самое, что они * * действительный синтаксис – jonrsharpe

+2

@ TheChetan: нет, нет. Python фокусируется на читаемости, а не на лаконичности. –

2

Вы не можете использовать перерыв в вашей логике петли может быть повторно написано с использованием itertools.takewhile если вы хотите получить более сжатое решение

digits = list(str(102)) 
dummy = list(str(102/2)) 

from itertools import takewhile 

for d in takewhile(dummy.__contains__, digits): 
    dummy.remove(d) 

Вы также можете удалить необходимость для другого использования для цикла путем изменения вашей логики, проверьте, если J не в фиктивной ломки, когда это правда:

for j in digits: 
    if j not in dummy: 
     break 
    dummy.remove(j) 

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

digits = str(102) 
dummy = list(str(102/2)) 
st = set(takewhile(dummy.__contains__, digits)) 
dummy[:] = [d for d in dummy if d not in st] 

print(dummy) 

Вы можете также перебирать строку, нет необходимо вызвать список на цифры, если вы не планируете выполнять некоторые операции с ним после него.

+2

Ужасно, чтобы избежать метода dunder здесь; вы можете использовать 'functools.partial' и' operator.contains', например. 'in_dummy = partial (contains, dummy)'. Это похоже на большую работу, чтобы избежать метода подчеркивания, и никаких реальных преимуществ. Лямбду можно использовать альтернативно, например. 'lambda e: e in dummy'. –

+0

@JaredGoguen, да, я не против использовать '__contains__' в таком случае, определенно лучше, чем лямбда, может быть интересно сравнить время. –