2017-02-09 42 views
1
def myzip(*iterables): 
    l = [] 
    t = tuple() 
    x = [iter(a) for a in iterables] 
    while True: 
     for a in x: 
      for i in range(3): 
       t = t + tuple(a) 
      l.append(t) 
    for x in l: 
     yield x 

我需要写myzip发电机接受任意数目iterables的(呼叫数n)它在产生所述第一值的n元组每个可迭代的,每个可迭代的第二个值等;如果一个迭代在所有其他迭代之前耗尽,那么它在n元组中的位置应该存储None。发生器占据N iterables并产生所述第一值的n元组中的每个迭代

例如:

for i in myzip('abcde','fg','hijk'): 
    print(i,end='') 

打印5 3元组('a','f','h')('b','g','i')('c',None,'j')('d',None,'k')('e',None, None)

由于某些原因,我的程序失败了,它没有产生任何东西。

+0

你的'yield'语句不在'while True'循环中,所以它永远不会产生。 – sytech

+0

我附加列表中的所有内容,并从列表中获得收益 – chenyinuo

+2

不,请仔细查看缩进情况。循环'for x in l'永远不会发生,因为它在'while True'循环之外。 – sytech

回答

0

您的方法有几个逻辑问题。我创建了一个功能,可以通过一些改进来完成您正在寻找的功能。特别是,在while循环的每次迭代期间调用yield,而不是将元组存储在列表中,并在最后依次编号yield。这是我的东西,似乎关闭名单:

  1. while循环没有终止(无间断)
  2. 有一个神奇的数字3扔在那里(似乎是iterables的硬编码数)
  3. 而不是使用for ... in ...语法来读取每个迭代,next()函数现在用于读取每个迭代中的下一个项目。
  4. 当所有iterables都枯竭型时,while循环现在打破

下面是修改的功能:

def myzip(*iterables): 
    x = [iter(a) for a in iterables] 
    sentinel = object() 
    while True: 
    l = [] 
    valid = False 
    for y in x: 
     item = next(y, sentinel) 
     if item is sentinel: 
     item = None 
     else: 
     valid = True 
     l.append(item) 
    if not valid: 
     break 
    yield tuple(l) 

而且在行动,它的链接:

https://repl.it/FdCD/1

相关问题