我想转换此代码段
for val in G[k]:
if val in span[k]:
result.append((val,col))
elif val in G[k] and val not in span[k] and S[val][k] != 'col':
result.append((val,row))
进入列表理解。但这给了我错误:
[(val,col) if val in span[k] else (val,row) if val in G[k] and val not in span[k] and S[val][k] != 'col' for val in G[k]]
那么正确的语法是什么,如果有的话。
答案 0 :(得分:2)
更改
[(val,col) if val in span[k] else (val,row)
if val in G[k] and val not in span[k] and S[val][k] != 'col'
for val in G[k]]
到
[(val,col) if val in span[k] else (val,row)
for val in G[k]
if val in G[k] and val not in span[k] and S[val][k] != 'col' ]
经验法则如果理解前if
之前有for
,则必须有else
。
答案 1 :(得分:2)
您正在使用没有else
部分的条件表达式;这是一个语法错误。
正确的翻译是:
[(val,col) if val in span[k] else (val,row) for val in G[k] if val in span[k] or S[val][k] != 'col']
e.g。过滤掉任何与你的两个条件不匹配的东西,并在两个分支之间选择做导致添加到输出中的值。
我简化了条件;在第二个表达式中有一些冗余测试(val in G[k]
始终为G[k]
上的循环,如果val in span[k]
不是 True
然后反val not in span[k]
肯定也是True
,并且不需要再次进行测试。
就个人而言,我发现显式for
循环更具可读性,但您至少可以用相同的方式简化它:
for val in G[k]:
if val in span[k]:
result.append((val,col))
elif S[val][k] != 'col':
result.append((val,row))