遍历可调用迭代器

4
我想使用正则表达式从一些聊天记录中提取信息。被解析的字符串格式为03:22:32 PM <b>blcArmadillo</b>。我使用了python的type()命令来查找变量messages是一个可调用迭代器。我的问题是如何最有效地遍历可调用迭代器?它们像数组一样,可以使用索引吗?我能找到的唯一方法是循环遍历返回的值,并将它们添加到列表中,如下面的代码片段所示。
times = []
messages = re.compile(r'(?P<time>..:..:.. ..).*?<b>(?P<usrname>.*?):</b>').finditer(search)

for result in messages:
    times.append(result.group('time'))

有没有更好、更有效的方法来做这件事?感谢您的帮助。
1个回答

5

迭代器就是拥有 next 方法的一个对象。每次调用它时,它会在集合中返回下一个项。如果需要访问任意索引,则几乎必须将其转换为列表。不要这样做:

for result in messages:
    times.append(result.group('time'))

你可以这样说:

times = [result.group('time') for result in messages]

这段代码基本上做的是相同的事情。但是,我应该警告你,对于大型结果集,这样做会非常慢,并且会消耗大量内存。因此,如果您不需要随机访问,则不应这样做。如果数据不受信任的用户输入将确定出现多少结果,则还可以限制他们可以输入的数量。
编辑:我刚注意到我的先前答案并没有完全与您发布的片段相同,因此我进行了更新。

1
一个迭代器只是一个带有next方法的对象。不完全正确;迭代器还具有'iter'方法,该方法返回相同的迭代器(以便内置的'iter(foo)'函数获取对象的可迭代版本,即使它已经是迭代器也是如此)。 - bignose

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接