我对单行 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)
打印命令给出了以下内容。不确定这是否正确!这是你想要的吗?
这是一个神秘的问题,我这里有字典并尝试遍历它并创建一个新的字典:
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)
打印命令给出了以下内容。不确定这是否正确!这是你想要的吗?