如何从这个深层嵌套的“ for”循环中创建列表推导?

时间:2018-07-23 02:53:41

标签: python for-loop list-comprehension

for role in self.collections[server.id][user.id]:
    for requested_set in self.roles[server.id]['sets']:
        if role in self.roles[server.id]['sets'][requested_set]['roles']:
            if requested_set not in requested_sets:
                requested_sets[requested_set] = []
            requested_sets[requested_set].append(role)

我试图分步骤进行。

第1行可以写为[x for x in self.collections[server.id][user.id]]

第2行可以写为[x for x in self.roles[server.id]['sets']]

第3行是我感到困惑的地方,因为它包含了第1行。

我开始尝试使用[x for x in (x for x in self.collections[server.id][user.id]) if x in self.roles[server.id]['sets'][requested_set]['roles']]

但是,我看到我将需要合并一个新变量来表示缺少的requested_set变量。有什么办法可以将所有这些全部放在一行吗?

1 个答案:

答案 0 :(得分:1)

将所有这些代码放在一行中是非常不可取的。尽管我个人喜欢列表理解,但有些人觉得它们很复杂。如果此代码以后有可能被编辑,最好不要出于维护目的而将其写在一行上。代码的真正成本是维护。并且,根据我目前的知识,不可能在声明之前获取该request_set变量。该代码太复杂了,以至于不能放在一行上。

但是,这不是我告诉您如何编写代码的地方。由于使用了request-set变量,不可能将所有内容放在一行上,但是可以将它们放在两行上:

for requested_set in self.roles[server.id]['sets']:
    requested_sets[requested_set] = [role for role in self.collections[server.id][user.id] if role in self.roles[server.id]['sets'][requested_set]['roles']]