Изменение списка с пониманием списка - PullRequest
0 голосов
/ 24 апреля 2020

Я хочу изменить список, используя его понимание. Примерно так:

c = [10,20,30,40,50,60,70,80,90]
a = [0,1,2]
b = [3,4,5]

c[a[jj]] = [c[a[jj]]+c[b[jj]] for jj in range(len(a))]

Мой ожидаемый результат:

c = [50,70,90,40,50,60,70,80,90]

Но каждый раз, когда появляется ошибка:

    c[a[jj]] = [c[a[jj]]+c[b[jj]] for jj in range(len(a))]
NameError: name 'jj' is not defined

Что я здесь не так делаю?

Редактировать: я пытаюсь повторить нижеприведенное утверждение без использования for для l oop:

for jj in range(len(a)):
    c[a[jj]] = c[a[jj]] + c[b[jj]]

Ответы [ 3 ]

1 голос
/ 24 апреля 2020

jj не определено с левой стороны. Даже если бы это было, назначение не будет делать то, что вы хотите. Вы хотите обычный for l oop:

for jj in range(len(a)):
    c[a[jj]] = c[a[jj]] + c[b[jj]]

Однако вы можете использовать enumerate и add-assign (+=), чтобы сделать его чище:

for jj, x in enumerate(a):
    c[x] += c[b[jj]]

Или еще лучше использовать zip:

for x, y in zip(a, b):
    c[x] += c[y]
0 голосов
/ 24 апреля 2020

Повторяет сказанное здесь много раз, но с некоторой дополнительной информацией:

c[a[jj]] = [c[a[jj]]+c[b[jj]] for jj in range(len(a))]

Этот оператор присваивания списка выводит ошибку, поскольку левая сторона (цель назначено) пытается получить элемент, который не существует. Вы написали индекс индекса, который является законным, но интерпретатор ищет индекс, на который ссылается какой-то jj, который еще не был определен.

В отличие от объекта словаря, где ключ может быть создан при его назначении, присвоение индекса для списка успешно выполняется, когда индекс находится в границах (ie. Позиция для назначения уже существует) или ссылка на имя уже определено.

jj хорошо использовать в выражении понимания списка. Синтаксис понимания списка позволяет определить новую переменную в выражении как цель итерируемого range(len(a)). Но поскольку интерпретатор оценивает весь оператор присваивания слева направо, jj не существует до выражения понимания списка.

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

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

0 голосов
/ 24 апреля 2020

Вы пытаетесь использовать циклическую переменную jj вне понимания списка, где она не определена. Я не совсем обернул голову вокруг того, что пытается сделать понимание списка, но для начала это ваша проблема. jj определяется только в пределах этой области в скобках, но не по ту сторону знака равенства, где вы присваиваете индекс c.

...