生成器需要n次迭代并在每次迭代中生成第一个值的n元组

时间:2017-02-09 05:12:22

标签: python

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

我需要写myzip生成器接受任意数量的iterables(调用数字n)它产生每个iterable中第一个值的n元组,​​每个iterable的第二个值等等;如果一个iterable在所有其他迭代之前耗尽,它在n元组中的位置应该存储None。

例如:

('a','f','h')('b','g','i')('c',None,'j')('d',None,'k')('e',None, None)

打印5个3元组toString()

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

1 个答案:

答案 0 :(得分:0)

您的方法存在几个逻辑问题。我创建了一个功能,通过一些改进来完成您正在寻找的功能。特别是,在yield循环的每次迭代期间调用while而不是将元组存储在列表中并在结尾处顺序yield。这是我列出的事情清单:

  1. while循环没有终止(没有中断)
  2. 那里有一个神奇的数字3投掷(似乎是一个硬编码的迭代次数)
  3. 现在使用for ... in ...函数来读取每个可迭代的下一个项目,而不是使用next()语法来读取每个可迭代的内容。
  4. 当所有迭代都用尽时,while循环现在被打破
  5. 以下是修改后的功能:

    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