python - 在三个数组上优化现有的 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 技能,这种编码似乎太菜鸟了。
解决方案
这些事情可以改进:
- 无需执行
range(len(boolean_list))
并将其与结果一起压缩。这就是enumerate
目的。 - 不需要
j
,因为i==j
总是。 - 不要比较
x == True
或x == False
- 这是不好的做法。做就是了if x
此外,您遇到了一个错误 - 您的代码从第一个数组 if comp
is 中获取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)]
推荐阅读
- python - How to vectorize this for loop?
- pandas - Vlook Up Elements from another dataframe 用于在 Python 中创建 MultiIndex DataFrame
- ruby-on-rails - rails电子邮件激活页面添加电子邮件地址
- python - SQLAlchemy: ObjectNotExecuteableError on joins
- amazon-web-services - Add permission for triggering lambda in api gateway via cloudformation
- angularjs - Unit test multiple calls to same function with different arguments angularjs/jasmine
- python - Remove not int elements in list
- json - Bind JSON data to row in table MVC 4
- java - pass values from RecyclerView to view it in activity
- java - java.rmi.AccessException: Registry.rebind 不允许;origin /10.0.0.71 是非本地主机