У меня проблема с однострочным оператором if else - PullRequest
0 голосов
/ 06 января 2020

Это таинственная проблема, которая возникает, у меня здесь есть словарь, и я пытаюсь перебрать его и создать новый дикт:

myDict = {(i,j):(i,j,i+j) if i != j else (i,2*i,3*i,4*i) for i in range(1,7) for j in range(1,7)}

newDict = {}
for i,j in myDict.items():
    for jj in j:
        newDict[jj]=[i] if jj not in newDict.keys() else newDict[jj].append(i)

, но он останавливается в третьем цикле и сталкивается с этой ошибкой:

AttributeError: у объекта 'NoneType' нет атрибута 'append'

, но при изменении оператора if else на этот код:

newDict = {}
for i,j in myDict.items():
    for jj in j:
        if jj not in newDict .keys():
            newDict[jj]=[i]
        else:
            newDict[jj].append(i)

Этот блок кода работает нормально, но я не знаю, в чем проблема с первым блоком кода.

Ответы [ 3 ]

5 голосов
/ 06 января 2020

Эти два фрагмента кода не эквивалентны, append не вернет ничего, а затем вы пытаетесь сохранить это Нет в newDict[jj]

Вам следует использовать defaultdict вместо

from collections import defaultdict
newDict = defaultdict(list)
for i,j in myDict.items():
    for jj in j:
        newDict[jj].append(i)
1 голос
/ 06 января 2020

Как @Sayse уже хорошо указал, что 'append' является операцией на месте и после добавления в список ничего не возвращает ('None').

Объяснение причины ошибки

Вы присваиваете в части условия if выражения условия, что означает, что в последующем else (или elif) все, что будет вычислено, будет также назначено. Таким образом, в этом случае будет вычислено другое, и оно будет присвоено newDict [jj].

Итак, что происходит, что для первой итерации i your if условие if выполняется, поэтому оно добавляется к dict. Когда я равен 2, тогда остальное входит в картину. Итак, добавление происходит, но помните, что добавление вернет None. Вот почему он добавляет None к ключам 1, 2 и 3 NewDict, начиная с i = 2 и далее. Как только None уже существует, когда начинается итерация 3 (i = 3), вы ничего не можете добавить к None, и поэтому вы получаете ошибку в 3-м цикле. Однако, если вы не используете синтаксис условного выражения, он будет работать нормально.

Как его исправить (если вы хотите придерживаться условного выражения в одну строку)

Вы Можно использовать приведенный ниже код, чтобы убедиться, что else вычисляется с альтернативным синтаксисом. Обратите внимание на небольшую разницу.

myDict = {(i,j):(i,j,i+j) if i != j else (i,2*i,3*i,4*i) for i in range(1,7) for j in range(1,7)}

newDict = {}
for i,j in myDict.items():
    for jj in j:
        newDict[jj]=[i] if jj not in newDict.keys() else newDict[jj]+[i]
print(newDict)

Команда печати дает мне следующее. Не уверен, что это правильно! Это то, что вы хотели?

enter image description here

0 голосов
/ 06 января 2020
a = 1 if False else a = 3  # wrong
a = 1 if False else 3  # correct

Проблема в вашем случае в том, что append возвращает None и записывает его в dict

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...