Python:编写嵌套 for 循环和 if 语句的更好方法

Python: Better way to write nested for loops and if statements

我正在尝试寻找一种更 Pythonic 的方式来执行以下操作。

for employee in get_employees:
    for jobs in employee['jobs']:
        for nemployee in employee_comps:
            if nemployee['employee_id'] == employee['id']:
                for njob in nemployee['hourly_compensations']:
                    if njob['job_id'] == jobs['id']:
                        njob['rate'] = jobs['rate']

它可以工作,但看起来很笨重。我是 Python 的新手,如果有其他线程可以帮助解决这个问题,请指导我!

您的代码非常干净且符合 Python 风格,我建议您继续使用。

如果你想把它放在一行中,这个应该可以工作,但我没有数据来测试它,所以我不确定。

[[njob.update({njob['rate']: jobs['rate']}) for njob in nemployee['hourly_compensations'] if njob['job_id'] == jobs['id']] for employee in get_employees for jobs in employee['jobs'] for nemployee in employee_comps if nemployee['employee_id'] == employee['id']]

我对代码的主要评论是您可以自由更改外部三个 for 循环的顺序,因为您正在执行的操作不取决于您循环的顺序这些(因为在找到匹配项时您没有跳出任何循环),并且鉴于这种情况,执行 jobs 循环只是为了到达内部的 if 语句是没有意义的它与 jobs 的值无关。将 jobs 循环放在其他两个循环内会更有效,这样它也可以在 if 内,即只对 employee 的值组合执行循环和 nemployee 其中 if 条件计算 True.

除此之外但不太重要的是,在进行此重新排列后有连续的 for 语句(在独立的可迭代对象上)时,您可以用 itertools.product 迭代器上的单个循环替换它们以减少如果您愿意,for 循环的嵌套深度(将其从四个显式循环减少到两个):

from itertools import product

for employee, nemployee in product(get_employees, employee_comps):
    if nemployee['employee_id'] == employee['id']:
        for jobs, njob in product(employee['jobs'],
                                  nemployee['hourly_compensations']):
            if njob['job_id'] == jobs['id']:
                njob['rate'] = jobs['rate']