[英]How do I get at the contents of an iterator?
我很困惑。 我从较大的表格中抓取了一部分HTML。 它看起来像这样:
<td align="left" class="page">Number:\xc2\xa0<a class="topmenu" href="http://www.example.com/whatever.asp?search=724461">724461</a> Date:\xc2\xa01/1/1999 Amount:\xc2\xa0$2.50 <br/>Person:<br/><a class="topmenu" href="http://www.example.com/whatever.asp?search=LAST&searchfn=FIRST">LAST,\xc2\xa0FIRST </a> </td>
(实际上,它看起来更糟,但我换了很多换行符)
我需要删除所有行,然后拆分“日期/金额”行。 似乎开始的地方是找到该HTML块的子代。 该块是一个字符串,因为正则表达式就是这样把它还给我的。 所以我做了:
text_soup = BeautifulSoup(text)
text_children = text_soup.find('td').childGenerator()
我已经得出结论, 我只能对text_children
一次迭代 ,尽管我不知道为什么这样做。 这是一个listiterator
类型,我很难理解。
我习惯于假设,如果我可以使用for循环遍历某些内容,则可以使用诸如text_children [0]之类的任何元素来调用它。 迭代器似乎并非如此。 如果我使用以下方法创建列表:
my_array = ["one","two","three"]
我可以使用my_array[1]
查看数组中的第二项。 如果我尝试执行text_children[1]
收到错误消息:
TypeError: 'listiterator' object is not subscriptable
我如何获得迭代器的内容?
您可以通过以下方式轻松地从迭代器构造列表:
my_list = list(your_generator)
现在,您可以对元素进行下标:
print(my_list[1])
另一种获取值的方法是使用next
。 这将从迭代器中提取下一个值,但是,正如您已经发现的那样,一旦将值从迭代器中提取出来,就无法始终将其放回去(是否可以将其放回去完全取决于被迭代的对象及其next
方法的实际外观)。
这样做的原因是,通常您只需要可以迭代的对象。 迭代器非常有用,因为它们一次计算元素1而不需要存储所有值。 换句话说,迭代器中只有一个元素一次消耗系统的内存,而列表或元组通常在开始迭代之前将所有元素存储在内存中。
我尝试得出一个更一般的答案:
可迭代对象是可以迭代的对象。 这些包括列表,元组等。根据请求,它们提供迭代器。
迭代器是其用于迭代的对象。 它为每个请求提供一个值,如果结束,则结束。 这些是生成器,列表迭代器等,但也有文件对象。 每个迭代器都是可迭代的,并将自身作为其迭代器。
例:
a = []
b = iter(a)
print a, b # -> [] <listiterator object at ...>
如果你这样做
for i in a: ...
通过其__iter__()
方法请求一个迭代器,然后查询该迭代器以获取下一个元素,直到耗尽为止。 这是通过.next()
(在3.x中为__next__()
)方法发生的。
索引编制是完全不同的事情。 如果对象没有.__iter__()
方法,则可以通过索引进行迭代,因此每个可索引的对象都是可迭代的,但反之亦然。
如前所述,最简单的答案是从您的生成器创建一个列表。
像这样: list(generator)
长答案,以及有关原因的解释:
当您创建一个生成器,或者您创建一个“ listiterator”(一个漂亮的汤使用的生成器)时,您实际上并不是在创建项目列表。 您正在创建一个对象(生成器),该对象知道如何迭代一定数量的项目,一次迭代一次,( next()
)
那是什么意思。
而不是说一本书,而不是您想要的。
你会得到一台打字机。
打字机可以创建一个有页的书,但一次只能一页。 现在,如果您只是从头开始,并且像for循环一样一次查看它们,那么是的,这几乎就像读一本普通的书一样。
但是与普通书籍不同的是,一旦打字机完成一页纸,您就不能向后退,该页现在不见了。
我希望这有道理。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.