python - 如何从这个深度嵌套的“for”循环中创建列表理解?
问题描述
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
变量。有没有办法可以把这一切放在一条线上?
解决方案
将所有这些代码放在一行中是非常不可取的。虽然我个人喜欢列表推导,但有些人觉得它们很复杂。如果这段代码以后有可能被编辑,出于维护目的,最好不要写在一行上。代码的真正成本是维护。而且,以我目前的知识,不可能在声明之前获得 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']]
推荐阅读
- ios - 更改 NavigationView 标题 SwiftUI 的颜色
- swift - Swift 在位置服务中杀死了应用程序获取数据?
- c++ - 如何从 QDialog 的 const 方法显示 QMessageBox?
- c++ - 将任何类型的表达式放在 C++ 的初始化列表中在语法上是否正确?
- api - 如何从 iOS 中的 Dynamics CRM 获取联系人 API?
- android - play-services-ads:18.0.0 和 appcompat-v7:28.0.0 - 合并失败,使用 groupid com.android.support 和 androidx.* 的依赖项无法合并
- javascript - 角度:7 如何在父组件上测试子发射器?
- webdriver-io - Firefox 的 Webdriver IO 自动化测试用例失败
- python - 如何从第一个类中声明的另一个类访问类的对象?
- typescript - 打字稿类型检查类型