首页 > 解决方案 > 在三个数组上优化现有的 for 循环

问题描述

我有三个列表/数组:一个是布尔值列表,另外两个是具有某些值的数组。我的目标是遍历布尔列表,如果值为真,则取第一个数组的第 j 个值并将其安全地保存在解决方案数组中,如果值为假,则取第二个数组的第 j 个值和将其保存到解决方案数组中。

这是我现在的解决方案:

j = 0
for comp, i in zip(boolean_list,range(len(boolean_list))):
   if comp == False: 
      solutio_array[i] = first_array[j]
   else:
      solutio_array[i] = second_array[j]
   j += 1

这对于 Python 来说看起来太复杂和 Fortran 风格了。所以我的问题是,如何在 Python 中更有效地解决这个问题?

谢谢您的帮助!我想提高我的 Python 技能,这种编码似乎太菜鸟了。

标签: pythonarraysperformancefor-loopoptimization

解决方案


这些事情可以改进:

  1. 无需执行range(len(boolean_list))并将其与结果一起压缩。这就是enumerate目的。
  2. 不需要j,因为i==j总是。
  3. 不要比较x == Truex == False- 这是不好的做法。做就是了if x

此外,您遇到了一个错误 - 您的代码从第一个数组 if compis 中获取False,而不是从第二个数组中获取。

总之,我会这样做:

for i, comp in enumerate(boolean_list):
    if comp:
        solutio_array[i] = first_array[i]
    else:
        solutio_array[i] = second_array[i]

或者,也许是这样的:

for i, comp in enumerate(boolean_list):
    source_array = first_array if comp else second_array
    solutio_array[i] = source_array[i]

另一方面i,如果您正在创建一个新的,则可以完全避免使用solutio_array

solutio_array = [first if comp else second
                 for first, second, comp
                 in zip(first_array, second_array, boolean_list)]

推荐阅读