列表和字典理解功能强大且快速,但它们很难阅读。当他们深深嵌套时,我的心理阅读缓冲区很快就会填满,尤其是。有没有办法让这些更具可读性?
答案 0 :(得分:11)
current_team = dict((k,v) for k,v in list(team.items()) for player in v[‘player’] if player['year'] == 2013)
太多年的C和Java编程使我难以阅读。理解是逻辑分解成不同的部分,但我仍然需要真正盯着它来分解它。
要记住的关键是理解是一种表达,而不是一种陈述。因此,您可以使用parens包围表达式,然后使用implicit line joining添加基于其嵌套级别组织表达式的换行符:
current_players = (dict((k,v)
for k,v in list(team.items())
for player in v['player']
if player['year'] == 2013))
这里更清楚“the last index varying fastest, just like nested for loops.”
您甚至可以添加空行和注释:
current_players = (dict((k,v) # dict comprehension:
for k,v in list(team.items()) # let’s filter the team member dict...
for player in v['player'] # for players...
if player['year'] == 2013)) # who are playing this year
需要注意的一点是:Python语言参考说“延续行的缩进并不重要。”因此,您可以使用任何形式的缩进来提高可读性,但解释器不会进行任何额外的检查。 / p>
答案 1 :(得分:1)
另一种方法是保持理解的力量,但是在生成器上构建生成器来移除嵌套,然后使用内置list
/ set
/ dict
等...类似于:
{k:v for k, v in enumerate(range(10)) if v % 2 == 0}
可以分发到:
with_idx = enumerate(range(10))
is_even = (el for el in with_idx if el[1] % 2 == 0)
as_dict = dict(is_even)
实际上更详细,但如果将类似的逻辑应用于嵌套级别,那么实际上更有意义。