Python 将循环块转换为列表
我想转换这个代码段Python 将循环块转换为列表,python,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
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]]
那么,如果有更改,正确的语法是什么
[(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)
if val in G[k] and val not in span[k] and S[val][k] != 'col'
for val in G[k]]
到
经验法则如果理解中的
在之前有一个If,那么它必须有一个else您使用的条件表达式没有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]
总是正确的,如果span[k]中的val不是true
则span[k]
中的逆val不是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))
您使用的条件表达式没有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不在span[k]
当然也是正确的
,无需再次测试
就我个人而言,我觉得显式的for
循环更具可读性,但您至少可以用同样的方式简化它:
for val in G[k]:
if val in span[k]:
result.append((val,col))
elif S[val][k] != 'col':
result.append((val,row))
不要这样做。它的可读性比普通循环差得多-至少如果你以一行程序的形式编写它。不要这样做。它的可读性比普通循环差得多-至少如果你以一行程序的形式编写它。谢谢Martijn。理解比普通循环快是真的吗?@user2290820:别忘了维护也需要努力。不要忘记如果不能读懂代码的代价以后会影响你,那么不要过早地优化速度。@user2290820:列表理解可能比使用.append()
循环的更快,是的,但是你的列表组件必须在span[k]中测试val
两次。很酷,当然。注释中包含了更简单的可读逻辑。如何?如果这是在代码中的时间关键路径上,我会测试计时(使用timeit
模块),否则我就自己用一个来进行循环。谢谢Martijn。理解比通常的循环更快是真的吗?@user2290820:别忘了维护也需要努力。如果不能阅读代码的代价会让你以后痛苦不堪,不要过早地优化速度。@user2290820:a list comprehension可以比使用.append()
的循环快,是的,但是您的列表comp必须在span[k]
中测试val两次。很酷,当然。注释包括更简单的可读逻辑。怎么样?如果这是在代码中的时间关键路径上,我会测试计时(使用timeit
模块),否则我只会对自己使用循环。