将循环块转换为列表理解

时间:2013-11-07 15:15:28

标签: python

我想转换此代码段

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

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

2 个答案:

答案 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))