使用Python2.7获取循环中(非无限)迭代器的长度

2024-05-08 21:39:04 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在使用一些使用itertools.imap生成的迭代器,我在想是否有一种方法可以访问for-loop中的迭代器长度,我用它来循环元素。你知道吗

我可以肯定的是,迭代器不会生成无限量的数据。你知道吗

另外,因为我循环的信息是从查询到数据库的,所以我可以从那里得到信息的长度,但是我使用的函数必须返回一个迭代器。你知道吗

我想到了一些选择:

def iterator_function(some, arguments, that, I, need):
    query_result = query()
    return_iterator = itertools.imap(
        mapping_function,
        query_result
    )
    return return_iterator

因为我无法更改返回的迭代器,所以我想到了一些东西(非常难看),比如:

query_result = query()
query_size = len(query_result)

return_iterator = itertools.imap(
    lambda item: (mapping_function(item), query_size),
    query_result
)

return return_iterator

但我不太喜欢这个选项,我在想,在Python中,是否有一种方法可以从循环中获取迭代器的大小,比如:

for item in iterator():
    print item.iterator_length()
    # do other stuff

或者类似于:

for item in iterator():
    print iterator.length() # or iterator().length()???

谢谢!你知道吗


Tags: 方法in信息forsizereturnfunctionresult
2条回答

我不知道我的想法是否正确,但是class generator pattern 并尝试添加序列bahaviour:

if your class represents something that has a length, don't define a GetLength method; define the __len__ method and use len(instance).

像这样:

class firstn(object):
    def __init__(self, n):
        self.n = n
        self.num, self.nums = 0, []

    def __iter__(self):
        return self

    # Python 3 compatibility
    def __next__(self):
        return self.next()

    #    V   - Something like this 
    def __len__(self):
        return self.my_length

    def next(self):
        if self.num < self.n:
            cur, self.num = self.num, self.num+1
            return cur
        else:
            raise StopIteration()

Also, because the information I'm looping are from a query to a database, I can get the length of the information from there, but the function I'm using has to return an iterator.

假设你有一个很好的数据库,在那里进行计数。怀疑python中的任何解决方案都会更快/更干净。你知道吗

相关问题 更多 >