簡體   English   中英

如何編寫一個生成器,在Python中的iterable中返回ALL-BUT-LAST項?

[英]How to write a generator that returns ALL-BUT-LAST items in the iterable in Python?

昨天我問了一些類似的問題[1,2],並得到了很好的答案,但我在技術上還不夠熟練,自己寫出這樣一個復雜的發電機。

如果它是最后一項,而不是讓它產生,我怎么能寫一個會引發StopIteration的生成器呢?

我想我應該以某種方式一次詢問兩個值,看看第二個值是否為StopIteration。 如果是,那么我應該提高這個StopIteration而不是產生第一個值。 但不知何故,我還應該記住,如果不是StopIteration,我會問第二個值。

我不知道怎么寫自己。 請幫忙。

例如,如果iterable是[1,2,3],那么生成器應該返回1和2。

謝謝,Boda Cydo。

[1] 如何在Python中修改生成器?

[2] 如何確定Python生成器中的值是否為1-BUT-LAST?

這應該做的伎倆:

def allbutlast(iterable):
    it = iter(iterable)
    current = it.next()
    for i in it:
        yield current
        current = i


>>> list(allbutlast([1,2,3]))
[1, 2]

這將迭代整個列表,並返回前一項,以便永遠不會返回最后一項。
請注意,在[]和[1]上調用上面的內容將返回一個空列表。

首先,真的需要一台發電機嗎? 這聽起來像Python的切片語法的完美工作:

result = my_range[ : -1]

即:從第一個項目到最后一個項目的范圍。

itertools模塊在其配方中顯示了一個pairwise()方法。 根據這個配方,你可以得到你的發電機:

from itertools import *

def n_apart(iterable, n):
    a,b = tee(iterable)
    for count in range(n):
        next(b)
    return zip(a,b)

def all_but_n_last(iterable, n):
    return (value for value,dummy in n_apart(iterable, n))

n_apart()函數返回值對,這些值在輸入iterable中是n個元素,忽略所有對。 all_but_b_last()返回所有對的第一個值,偶然忽略列表的n個最后元素。

>>> data = range(10)
>>> list(data)
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> list(n_apart(data,3))
[(0, 3), (1, 4), (2, 5), (3, 6), (4, 7), (5, 8), (6, 9)]
>>> list(all_but_n_last(data,3))
[0, 1, 2, 3, 4, 5, 6]
>>> 
>>> list(all_but_n_last(data,1))
[0, 1, 2, 3, 4, 5, 6, 7, 8]

more_itertools項目有一個模擬itertools.islice的工具,支持負索引:

import more_itertools as mit

list(mit.islice_extended([1, 2, 3], None, -1))
# [1, 2]
gen = (x for x in iterable[:-1])

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM