如何解决为什么itertools.dropwhile仅与列表一起使用一次?
我无法理解itertools.dropwhile()的以下行为。 假设我有一个列表:
numbers = [1,2,3,4,5]
我这样覆盖:
numbers = list(itertools.dropwhile(lambda x: sum(numbers[0:x]) <=7,numbers))
值[1,3]的总和小于7,所以我希望它们会被丢弃。 实际上,输出为:
>>>numbers
[4,5]
我重复:
numbers = list(itertools.dropwhile(lambda x: sum(numbers[0:x]) <=7,numbers))
我希望输出现在为[5]
。但是,我再次看到:
>>>numbers
[4,5]
为什么会这样?
解决方法
您的代码没有执行您认为的操作。您传递给dropwhile
的可调用对象将获取元素,而不是索引。
第一次调用的结果为[4,5]
的原因是:
-
sum(numbers[0:1]) <= 7
-
sum(numbers[0:2]) <= 7
-
sum(numbers[0:3]) <= 7
都小于或等于7。
在第二次通话中,numbers[0:4]
和numbers[0:5]
都只是整个列表,总和始终为9。
您可以代替dropwhile
进行枚举:
>>> numbers = [1,2,3,4,5]
>>> numbers = [element for i,element in itertools.dropwhile(lambda x: sum(numbers[0:x[0]+1]) <= 7,enumerate(numbers))]
>>> numbers
[4,enumerate(numbers))]
>>> numbers
[5]
>>> numbers = [element for i,enumerate(numbers))]
>>> numbers
[]
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。