【问题标题】:takewhile in itertools takes one value too muchitertools 中的 takewhile 取一个值太多
【发布时间】:2016-05-30 17:39:30
【问题描述】:

我有以下代码在某个值上停止迭代器,将状态保存到该值并返回保存的状态和原始状态。我正在使用 itertools 中的 takewhile 来获取给定 break_point 之前的值,然后在保存的迭代器上使用 chain 直到 break_point 和初始迭代器来合并它们:

from itertools import takewhile, chain

def iter_break(iterator_input, break_point):

    new_iter = list(takewhile(lambda x: x <= break_point-1, iterator_input))
    return chain(iter(new_iter), iterator_input)

import unittest


class TestEqual(unittest.TestCase):

    def test_iters(self):

        it = iter(range(20))
        old_it = iter_break(it, 10)
        self.assertEqual(list(it), list(old_it))

if __name__ == '__main__':
    unittest.main()

问题是,最终返回的迭代器和我返回的完整迭代器并不相似,因为返回的迭代器错过了一个值,它错过了等于断点本身的值。请帮忙。

【问题讨论】:

  • 要么尝试从 break_point-1 中删除“-1”,要么执行“
  • 如果takewhile 没有找到不符合条件的元素,您如何期望它停止迭代?当然断点是从迭代器中消耗的,这就是停止takewhile

标签: python python-2.7 itertools


【解决方案1】:

it 不仅缺少断点值,它还缺少之前的所有值,因为它只是一个用iter 创建的迭代器,而不是一个列表,所以iter_sample 在用@ 迭代它们时使用了值987654324@。这包括断点本身,因为takewhile 需要查看该值才能知道条件不再满足。

【讨论】:

  • @ivan_bilan islice 用于获取固定数量的元素,而不管值如何,但您的问题表明迭代器应该在达到某个值之前停止。您对range 的测试没有显示问题,因为每个元素的索引都等于其值,但这似乎不是您想要的。尝试使用更复杂的列表进行测试。此外,您的问题不是断点丢失,而是您传递了一个可以使用的迭代器这一事实。你解决了吗?
  • 它应该在某个索引处停止,所以 islice 会做应该做的事情。是的,它也消耗值,但是使用链来合并切片迭代器和输入迭代器中剩余的值似乎可以工作。
猜你喜欢
  • 2016-03-15
  • 1970-01-01
  • 2018-01-10
  • 1970-01-01
  • 2017-11-22
  • 1970-01-01
  • 2022-01-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多