python - 如何在while中使用for循环编写代码?
问题描述
我想返回差异最大的两个索引,而最小值在最大值的左侧。这是我的代码:
def get_buy_sell_dates(price_list):
min = 0
max = -1
while min < (max + len(price_list)):
for i in range(1, len(price_list)-1):
if price_list[min] > price_list[i]:
min = i
if price_list[max] < price_list[-i-1]:
max = -i-1
return (min,max + len(price_list))
但是对于[7,10,1,3,6,4]
它返回的列表(2, 1)
而不是 (2, 4)
解决方案
使用两个嵌套的 for 循环。对于列表中的每个值,您将遍历右侧的值。您可以通过跳过下一个值较低/较大的值来使其更快。显然,如果紧跟在您检查的最小值之后的值低于您正在检查的值,则不需要检查当前值。最大值也反过来。我确信您可以添加许多其他优化。
def get_buy_sell_dates(price_list):
max_diff = 0
max_diff_min = 0
max_diff_max = -1
for i in range(len(price_list)):
ix = min(len(price_list) - 1, i + 1)
if price_list[ix] >= price_list[i]:
for n in range(ix, len(price_list)):
nx = min(len(price_list) - 1, n + 1)
if price_list[n] >= price_list[nx]:
diff = price_list[n] - price_list[i]
if diff > max_diff:
max_diff = diff
max_diff_min = i
max_diff_max = n
if max_diff > 0:
return (max_diff_min, max_diff_max)
else:
return None
推荐阅读
- ruby-on-rails - Rails has_and_belongs_to_many 和表单
- zend-framework - 5.7.1
:客户端主机被拒绝:访问被拒绝 - php - 从 stdClass 对象 TotalRecords 获取数据
- typescript - 如何翻译成打字稿: require('module').globalPaths.push(process.env.NODE_MODULES_PATH);
- vba - 使用 VBA 和 WINSCP 从 MS-Access 上传 SFTP
- java - 更新 camel-sap 缓存而不重新启动整个实例
- java - 用于列表的 Java JAX-RS @DefaultValue
- javascript - 如何访问特定的 Web 元素 Selenium Python
- javascript - react native 如何避免 EPERM 错误?
- node.js - 为 DRY 重构节点代码(不要重复你自己)