-1

我正在尝试找到一种更 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 新手,如果有另一个线程可以帮助解决这个问题,请指导我!

4

2 回答 2

0

您拥有的代码非常干净和pythonic,我建议您继续使用它。

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

[[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']]
于 2020-08-24T03:00:27.570 回答
0

我对代码的主要评论是您可以自由更改外部三个for循环的顺序,因为您正在执行的操作不依赖于您在这些循环上循环的顺序(因为您没有中断任何找到匹配项时循环),并且鉴于这种情况,执行jobs循环只是为了到达if其中独立于 . 的值的语句是没有意义的jobs。将jobs循环放在另外两个里面会更有效,这样它也可以在里面if,即循环只对那些值的组合employee和条件计算的nemployee地方执行。ifTrue

除此之外但不太重要的是,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']
于 2020-08-24T03:10:55.200 回答