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

2024-09-30 03:22:34 发布

您现在位置:Python中文网/ 问答频道 /正文

我正试图找到一种更具python风格的方法来做下面的事情

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新手,如果有其他线程可以帮助我,请指导我


Tags: 方法inidforgetifrate风格
2条回答

我对代码的主要评论是,您可以自由地更改外部三个for循环的顺序,因为您正在执行的操作并不取决于您在这些循环上的顺序(因为在查找匹配项时,您不会中断任何循环),并且假设是这样,只在jobs循环中到达与jobs值无关的if语句是没有意义的。将jobs循环放在另外两个循环内会更有效,这样它也可以放在if内,也就是说,循环只针对employeenemployee值的组合执行,其中if条件计算True

除此之外,但不太重要的是,如果在执行此重排后存在连续的for语句(在独立的iterables上),则可以使用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']

您拥有的代码非常干净,非常符合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']]

相关问题 更多 >

    热门问题