2015-05-07 27 views
8

我不能使用itertools繼續,直到所有迭代完成的Python

所以編碼看起來很簡單,但我有算法的麻煩思維繼續運行,直到所有迭代已處理完畢的發電機。

功能的想法是把2個iterables因爲這樣的參數...

(['a', 'b', 'c', 'd', 'e'], [1,2,5])

而且它的作用是產生這些價值觀......

a, b, b, c, c, c, c, c

但是,如果第二次迭代首先耗盡了元素,則該函數只會迭代餘下的值一次...

那麼其餘的值將被重複這樣的:

d, e

def iteration(letters, numbers): 
    times = 0 
    for x,y in zip(letters, numbers): 
     try: 
      for z in range(y): 
       yield x 
     except: 
      continue 

[print(x) for x in iteration(['a', 'b', 'c', 'd'], [1,2,3])] 

我有困難,忽略了第一的StopIteration並繼續完成。

+0

那麼這就是我遇到的問題,以及。我不知道如何讓迭代同時繼續,以便a得到1的值,b得到2的值。 – FlyingBumble

+0

d和e應該發生什麼? –

+0

當帶數字的迭代器耗盡時,第一個中的剩餘迭代器件每個應該只產生一次。 – FlyingBumble

回答

18

所以您打印的字母至少一次使用的1爲下一個默認值:

def iteration(letters, numbers): 
    # create iterator from numbers 
    it = iter(numbers) 
    # get every letter 
    for x in letters: 
     # either print in range passed or default range of 1 
     for z in range(next(it, 1)): 
      yield x 

輸出:

In [60]: for s in iteration(['a', 'b', 'c', 'd', 'e'], [1,2,5]): 
    ....:  print(s) 
    ....:  
a 
b 
b 
c 
c 
c 
c 
c 
d 
e 
+0

感謝這幫了一大堆忙,很容易理解我出錯的地方。如果失敗,我不知道你可以給迭代器分配一個默認值。 – FlyingBumble

+0

@FlyingBumble,沒有概率,這是一個有趣的問題。是的,接下來的第二個值是一個默認值,它將避免StopIteration,並且允許我們至少查看一次每個字符串。 –

2

閱讀zip()的文檔。它說: 「zip()只應該用於不等長度輸入,當你不關心後續的,不匹配的值時,如果這些值很重要,請使用itertools.zip_longest()來代替。