@Vadim200102

Можете объяснить как это работает?

Код:
value = list(map(int, input().split())) (это я понимаю)
value_mid = sum(value:=value[:[i for i in range(len(value)) if value[i] < 0][0]]) /len(value)

Всё понимаю, кроме строки [:[i for i in range(len(value)) if value[i] < 0[0]]). Объясните, пожалуйста, очень понятно что и как это делает. И, желательно, напишите эквивалент. Меня в большей степени мучает это [0] после условия. Спасибо всем, кто помог!
  • Вопрос задан
  • 261 просмотр
Решения вопроса 1
Vindicar
@Vindicar
RTFM!
Жесть. Развернём её снаружи внутрь:
value_mid = sum(
    value:=value[
        :[
            i for i in range(len(value)) if value[i] < 0
        ][0]
    ]
 ) /len(value)


Снаружи сумма какого-то ряда чисел (не введённого) деленная на количество.
Далее идёт присваивание внутри выражения (одна из новых фишек питона, по сути value переопределяется.
Как следствие, len(value) уже будет содержать количество элементов в новом value, а не в оригинальном.
Далее идёт срез value[:X], то есть от начала и до указанног элемента НЕ включительно.
X это [i for i in range(len(value)) if value[i] < 0][0], то есть нулевой элемент списка, заданного выражением
[i for i in range(len(value)) if value[i] < 0]. Это выражение будет содержать индексы всех отрицательных элементов value, соответственно X будет содержать индекс первого отрицательного элемента value.
Тогда сумма будет считаться от начала списка и до первого отрицательного элемента (не включая), и количество тоже будет считаться также.
Вывод: выражение считает среднее значение элементов списка от начала и до первого отрицательного элемента, и делает это через чрезвычайно хитрозакрученную задницу.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@dmshar
Вообще-то у вас написано два раза разные вещи:
сначала:
value[:[i for i in range(len(value)) if value[i] < 0][0]])

потом:
[:[i for i in range(len(value)) if value[i] < 0[0]])

Это вас не "мучает", или это специально, что-бы всех запутать?

По первому варианту записи "[0] после условия" означает желание автора кода взять первый элемента списка, который сгенерирован вот тут:
[i for i in range(len(value)) if value[i] < 0]
а котором выбираются элементы списка, меньшие 0.
Соответственно,
value[:[i for i in range(len(value)) if value[i] < 0][0]]

отбор элементов этого списка, идущие до первого отрицательного элемента списка.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

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