在单行中嵌套 python 中的循环
Nested for loops in python in a single line
这是我试图提高可读性的一些代码。它可以工作,但是嵌套的 for 循环和 try/if 乍一看有点难以理解发生了什么。
有人可以就如何加入嵌套 for 循环或压缩此代码提出建议吗?
matcher = None
if re.match(_RE_OBJECT, nodes.replace(LQMN, '')):
matcher = alias
else:
for x in lister[0].conditions:
for y in x.codes:
try:
if y.id.split(',')[1] == condition:
matcher = x.codenames
except IndexError:
pass
您可以使用生成器表达式来嵌套循环并添加过滤器,使 IndexError
处理程序过时:
candidates = ((x, y) for x in lister[0].conditions for y in x.codes if ',' in y.id)
for x, y in candidates:
if y.id.split(',')[1] == condition:
matcher = x.codenames
尽管在这里使用 x
和 y
以外的更有意义的名称,可读性会得到更多提高:
candidates = ((cond, code) for cond in lister[0].conditions for code in cond.codes
if ',' in code.id)
for cond, code in candidates:
if code.id.split(',')[1] == condition:
matcher = cond.codenames
您可以使用单行 if 和 continue 语句代替 try 语句:
some_var = y.id.split(',')
if len(some_var) < 2: continue
if some_var[1] == condition:
matcher = x.codenames
并用有意义的名称替换 some_var。
这是我试图提高可读性的一些代码。它可以工作,但是嵌套的 for 循环和 try/if 乍一看有点难以理解发生了什么。
有人可以就如何加入嵌套 for 循环或压缩此代码提出建议吗?
matcher = None
if re.match(_RE_OBJECT, nodes.replace(LQMN, '')):
matcher = alias
else:
for x in lister[0].conditions:
for y in x.codes:
try:
if y.id.split(',')[1] == condition:
matcher = x.codenames
except IndexError:
pass
您可以使用生成器表达式来嵌套循环并添加过滤器,使 IndexError
处理程序过时:
candidates = ((x, y) for x in lister[0].conditions for y in x.codes if ',' in y.id)
for x, y in candidates:
if y.id.split(',')[1] == condition:
matcher = x.codenames
尽管在这里使用 x
和 y
以外的更有意义的名称,可读性会得到更多提高:
candidates = ((cond, code) for cond in lister[0].conditions for code in cond.codes
if ',' in code.id)
for cond, code in candidates:
if code.id.split(',')[1] == condition:
matcher = cond.codenames
您可以使用单行 if 和 continue 语句代替 try 语句:
some_var = y.id.split(',')
if len(some_var) < 2: continue
if some_var[1] == condition:
matcher = x.codenames
并用有意义的名称替换 some_var。