Ошибка синтаксиса в командной строке python один лайнер в цикле for [duplicate]

Предыдущее решение: Как заявил Martijn Pieters, правильный и самый быстрый формат:

if 1 in {x, y, z}:

Одна из основных проблем, которая, похоже, не рассматривается, заключается в том, что вы хотите, чтобы ваш выходной список включают каждое письмо после утверждения if. Используя только совет Martijn Pieters, у вас теперь будет:

if 0 in {x, y, z}:
    Mylist.append("c")
elif 1 in {x, y, z}:
    Mylist.append("d")
...

Проблема: первый оператор if вернет true, и вы никогда не получите следующий оператор elif. Таким образом, ваш список просто вернется:

["c"]

. Вы хотите иметь отдельные операторы if, чтобы python прочитал каждое утверждение, были ли первые правильными или ложными. Например:

if 0 in {x, y, z}:
    Mylist.append("c")
if 1 in {x, y, z}:
    Mylist.append("d")
if 2 in {x, y, z}:
    Mylist.append("e")
...

Это будет работать, но «если» вам удобно использовать словари (см. То, что я там сделал), вы можете очистить это, сделав исходный словарь, сопоставляющий числа с буквами вы хотите, а затем просто используйте цикл 'for':

numToLetters = {0:"c", 1:"d", 2:"e", 3:"f"}
for number in numToLetters:
    if number in {x, y, z}:
        Mylist.append(numToLetters[number])
10
задан vaultah 19 October 2015 в 16:22
поделиться

5 ответов

Короткое (хотя и действительное) ответ просто «потому что язык грамматика не определен, чтобы разрешить это». Что касается того, почему это случай, трудно, если не невозможно быть уверенным, если вы не спросите, кто бы ни придумал эту часть грамматики, но я полагаю, что это связано с читабельностью, что является одной из целей Python1.

Зачем вам когда-нибудь писать что-то неявное? Просто разделите его на несколько строк:

x = ['a','b']
for i,j in enumerate(x):
    print(i, ":", j)

Я бы сказал, что этот вариант намного яснее.


1 Из import this: Число читаемости.

11
ответ дан arshajii 25 August 2018 в 04:18
поделиться

Потому что грамматика Python запрещает это. См. документацию :

stmt_list     ::=  simple_stmt (";" simple_stmt)* [";"]

. Точки с запятой могут использоваться только для разделения простых операторов (а не составных операторов, таких как for). И, действительно, почти нет причин использовать их даже для этого. Просто используйте отдельные строки. Python не предназначен для того, чтобы было удобно застревать много кода на одной строке.

17
ответ дан BrenBarn 25 August 2018 в 04:18
поделиться

Поскольку Guido van Rossum, создатель Python и других разработчиков, на самом деле не нравится стиль форматирования кода с запятой и фигурными скобками.

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

from __future__ import braces

Заявления в Python должны быть разделены пустыми строками, а составные операторы в Python должны быть ограничены отступом.

Существование ; и однострочные составные утверждения (например, for i in x: print i) предназначены только для очень ограниченных уступок ... и вы не можете их комбинировать.

2
ответ дан Dan Lenski 25 August 2018 в 04:18
поделиться

Грамматика Python не позволяет этого. Это хороший ответ, но в чем причина?

Я думаю, что логика решения заключается в следующем: для того, чтобы быть распознанным, тело цикла for должно быть отступом. Поэтому, если мы допустим не simple_stmt, для этого потребуется сложный и простой отрыв.

1
ответ дан Dmytro Sirenko 25 August 2018 в 04:18
поделиться

Составной оператор состоит из одного или нескольких «предложений». Предложение состоит из заголовка и «набора». Заголовки предложений конкретного составного оператора находятся на одинаковом уровне отступов. Каждый заголовок статьи начинается с уникально идентифицирующего ключевого слова и заканчивается двоеточием. Набор представляет собой группу операторов, контролируемых условием. Набор может представлять собой один или несколько простых операторов, разделенных точкой с запятой, в той же строке, что и заголовок, после двоеточия заголовка, или это может быть один или несколько отступов для последующих строк.

x=['a','b'];

не оправдывает определение предложения и, следовательно, не может использоваться как составная часть составного оператора. Поэтому вы сталкиваетесь с ошибкой.

0
ответ дан Mayank Dixit 25 August 2018 в 04:18
поделиться
Другие вопросы по тегам:

Похожие вопросы: