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']
我正在尝试寻找一种更 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']