繁体   English   中英

我如何获得迭代器的内容?

[英]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&amp;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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM