簡體   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