gpt4 book ai didi

python - 'dropwhile' 是静态的吗?我可以让它动态吗?

转载 作者:行者123 更新时间:2023-11-28 23:00:24 25 4
gpt4 key购买 nike

简介

我想出了一个巧妙的解决方案来解决我的问题,但不太巧妙,它不起作用:-/

在我认为点击调试器几个小时之后,也许你可以验证这一点,它不起作用的原因是因为 itertools.dropwhile,在初始声明是固定的 - 而我希望我可以在每个循环中将输入参数更改为谓词。

下面的任务试图选择一个开始日期,然后是一个结束日期,然后是一个开始日期,最后一个结束日期……等等,这样我们就得到了一系列的日期间隔不重叠。开始日期来自一个列表,结束日期来自另一个列表。

以下解决方案循环遍历开始日期,然后遍历结束日期,使用 dropwhile 传递“过去”中的日期。它在第一次通过时完美运行。但在第二次传递时,结束日期停留在“2009-12-14”。我打破了“isbefore”例程,这样我就可以看到它什么时候被测试,什么时候没有。不确定,但我认为正在发生的事情是整个 dropwhile 测试在第一次通过时就固定下来,并且不会在每次通过时重新编译自身?正如我所希望/预期的那样。

为了完成它,我希望将它全部包装在 while True 中并通过 StopIteration 异常退出,从而提取完整的间隔序列。但它永远不会开火。当我尝试时,两个迭代器实际上都不会一直“下一个”到它的末尾。

问题

  1. 对于正在发生的事情,这个(一成不变的结论)是否正确?
  2. 是否有一种简短、干净、优雅的方式让它按照我希望的方式运行?我是否必须编写自己的 dropwhile 以按照我想要的方式运行?

代码

import itertools
import datetime

startdates = [
datetime.date(2009, 11, 5), datetime.date(2009, 11, 13),
datetime.date(2009, 12, 4), datetime.date(2009, 12, 7),
datetime.date(2009, 12, 29), datetime.date(2009, 12, 30)]

enddates = [
datetime.date(2009, 10, 1), datetime.date(2009, 10, 2),
datetime.date(2009, 11, 4), datetime.date(2009, 12, 14),
datetime.date(2009, 12, 15),datetime.date(2009, 12, 30)]

enddate = datetime.date(1900, 1, 1)
startdate = datetime.date(1900, 1, 1)

def isbefore(a, b):
return a <= b

for startdate in itertools.dropwhile(lambda date: isbefore(date, enddate), startdates):
for enddate in itertools.dropwhile(lambda date: isbefore(date, startdate), enddates):
print startdate, enddate
break

当前输出

2009-11-05 2009-12-14
2009-11-13 2009-12-14
2009-12-04 2009-12-14
2009-12-07 2009-12-14

期望的输出

2009-11-05 2009-12-14
2009-12-29 2009-12-30

细心的人会注意到我问了this question昨天提出了同样的问题,但那个问题需要一个通用的解决方案,而这次我专门询问 dropwhile 的工作原理。

最佳答案

一旦 dropwhile 删除了满足谓词的项目,它就会产生其余的未修改的可迭代对象。在它的位置使用 itertools.ifilterfalse 可以得到您想要的输出,因为它会在初始运行后继续处理谓词。

关于python - 'dropwhile' 是静态的吗?我可以让它动态吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12119422/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com