在三个阵列上优化现有的for循环

时间:2018-08-15 14:11:58

标签: python arrays performance for-loop optimization

我有三个列表/数组:一个是布尔值列表,另外两个是具有特定值的数组。 我的目标是遍历布尔列表,如果该值为true,则采用第一个数组的第j个值并将其放在解决方案数组中;如果该值为false,则采用第二个数组的第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技能,而这种编码似乎太菜鸟了。

1 个答案:

答案 0 :(得分:3)

这些问题可以改进:

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

另外,您遇到了错误-如果compFalse,则代码将从第一个数组获取,而不是从第二个数组获取。

一起,我会这样做:

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)]