在三个阵列上优化现有的forloop

2024-10-08 19:21:29 发布

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

我有三个列表/数组:一个是布尔值列表,另两个是具有特定值的数组。 我的目标是在布尔列表中循环,如果值为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技能,这种代码似乎太新手了


Tags: infalsetrue目标列表for数组zip
1条回答
网友
1楼 · 发布于 2024-10-08 19:21:29

这些东西可以改进:

  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]

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

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

相关问题 更多 >

    热门问题