2014-01-22 2 views
2

троичного оператора очень полезно, почему он не работает в данном конкретном случае:Python тройная оператора и назначение в еще

c="d" 
d={} 
d[c]+=1 if c in d else d[c]=1 

Это дает:

d[c]+=1 if c in d else d[c]=1 
         ^
SyntaxError: invalid syntax 

Я не вижу ничего плохого здесь, поскольку одно и то же без трёхмерного оператора работает:

c="d" 
d={} 
if c in d: 
    d[c]+=1 
else: 
    d[c]=1 
+0

В этом случае используйте defaultdict. 'from collections import defaultdict; d = defaultdict (int); d [c] + = 1'. – RemcoGerlich

+0

@RemcoGerlich: Зачем имитировать «Counter» с «defaultdict», если вы можете просто использовать «Counter»? – abarnert

+0

@abarnert: Сила привычки? Я всегда помню «defaultdict» первым, потому что он пришел раньше «Counter» и потому, что он более общий. – user2357112

ответ

11

Тернарный оператор работает с выражениями , а не утверждения. Назначение - это утверждение. Используйте обычный if/else.

+3

Или используйте 'defaultdict' и' d [c] + = 1'. Или, может быть, 'd [c] = d.get (c, 0) + 1'. – Blender

+2

@Blender: Не используйте 'defaultdict (int)' для имитации 'Counter'. Просто используйте «Счетчик», если хотите. – abarnert

+0

@abarnert: О, правильно. Я забыл про «Counter». – Blender

2

Правильный способ написать это будет:

d[c] = (d[c] + 1) if c in d else 1 
+0

Я думаю, что 'd.get (c, 0)') Блендера более ясный (а также избегает поиска вверх 'c' дважды), но это работает, и если OP может это понять, это хорошо. – abarnert

Смежные вопросы