1

我想转换这个片段

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]]

那么正确的语法是什么,如果有的话

4

2 回答 2

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' ]

经验法则如果在理解中有一个ifbefore for,它必须有一个else.

于 2013-11-07T15:17:06.407 回答
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']

例如,首先过滤掉与您的两个条件不匹配的任何内容,然后在两个分支之间选择确实会导致某些内容添加到输出中的值。

我简化了条件;在第二个表达式中有一些冗余测试(对于循环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))
于 2013-11-07T15:18:14.150 回答