我对单行 if else 语句有疑问

I have problem with one-line if else statement

这是一个神秘的问题,我这里有字典并尝试遍历它并创建一个新的字典:

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' object has no attribute '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)

这个代码块工作正常,但我不知道第一个代码块有什么问题。

这两个代码片段不等价,append 将 return none 然后您试图将 None 存储在 newDict[jj]

您应该改用 defaultdict

from collections import defaultdict
newDict = defaultdict(list)
for i,j in myDict.items():
    for jj in j:
        newDict[jj].append(i)
a = 1 if False else a = 3  # wrong
a = 1 if False else 3  # correct

你的问题是附加 returns None 并将其写入字典

@Sayse 已经很好地指出 'append' 是一个就地操作,添加到列表后 return 什么都没有 ('None')。

错误原因说明

您在条件表达式的 if 条件部分进行赋值,这意味着在后续的 else(或 elif)中,计算的任何内容也将被赋值。所以在这种情况下,将计算 else 并将其分配给 newDict[jj].

那么在 i 的第一次迭代中发生了什么,你的 if 条件得到满足,所以它被添加到字典中。当 i 等于 2 时,else 就出现了。所以追加正在发生,但记住追加将 return None。这就是为什么它从 i=2 开始向 NewDict 的键 1、2 和 3 添加 None。一旦 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)

打印命令给出了以下内容。不确定这是否正确!这是你想要的吗?