2013-12-19 121 views
7

在Python中跳過for循環中的第一個元素是否有強大的通用方法?如何跳過`for`循環中的第一個元素?

我能想到的唯一的辦法是用手工寫一個特殊的生成:

def skipFirst(it): 
    it = iter(it) #identity for iterators 
    it.next() 
    for x in it: 
     yield x 

,並將其用於例如像:

for x in skipFirst(anIterable): 
    print repr(x) 

和喜歡:

doStuff(str(x) for x in skipFirst(anIterable)) 

等等:

[ x for x in skipFirst(anIterable) if x is not None ] 

我知道我們可以在列表(x for x in aList[1:])做切片但是這使得副本,併爲所有序列,迭代器,收藏等

回答

6

當跳繩只是一個項目,我會用next() function

it = iter(iterable_or_sequence) 
next(it, None) # skip first item. 
for elem in it: 
    # all but the first element 

通過給它第二個參數,默認值,它也會吞下StopIteration異常。它不需要導入,可以簡化雜亂的for環路設置,並且可以使用 a for循環中有條件地跳過項目。

如果你在跳躍中的第一項的it所有元素期待迭代,然後itertools.islice()是合適的:

from itertools import islice 

for elem in islice(it, 1, None): 
    # all but the first element 
+0

哇,我不知道那個版本。但是我可以直接寫'doStuff(str(x)for x in next(anIterable,None))'嗎?我不這麼認爲。 – user2622016

+0

@ user2622016:我基本上只看到了你的問題的前半部分,使用'it.next()'並捕獲'StopIteration';有'下一個(它,無)'可以更容易閱讀。 –

+0

哦不,對不起,'next('asdf',None)'不起作用,它不會隱式地將序列改變爲迭代器。 – user2622016

0
def skip_first(iterable): 
    """Short and sweet""" 

    return (element for i, element in enumerate(iterable) if i) 

def skip_first_faster(iterable): 
    """Faster, but meh""" 

    generator = (element for element in iterable) 
    next(generator, None) # None Prevents StopIteration from being raised 

    return generator 

if __name__ == '__main__': 
    for item in skip_first(range(5)): 
     print item 

    for item in skip_first_faster(range(5)): 
     print item 
9
for i in list1[1:]: #Skip first element 
    # Do What Ever you want 

說明:

當你在for循環列表中使用[1:]它會跳過第一個元素並開始l從第二個元素到最後一個元素OOP

+0

Hiya那裏,雖然這可能很好回答這個問題,請成爲意識到其他用戶可能不像你那麼知識淵博。爲什麼不添加一點解釋爲什麼這個代碼工作?謝謝! – Vogel612

+0

感謝您的建議。 說明:對於列表1中的i [1:]: 在for循環列表中使用[1:]時,它將跳過第一個元素,並從第二個元素開始循環到最後一個元素。 –