【问题标题】:How to iterate over a list repeating each element in Python如何在 Python 中迭代重复每个元素的列表
【发布时间】:2008-12-20 18:23:52
【问题描述】:

我正在使用 Python 来无限地 迭代列表,重复列表中的每个元素多次。例如给定列表:

l = [1, 2, 3, 4]

我想将每个元素输出两次,然后重复循环:

1, 1, 2, 2, 3, 3, 4, 4, 1, 1, 2, 2 ... 

我知道从哪里开始:

def cycle(iterable):
  if not hasattr(cycle, 'state'):
    cycle.state = itertools.cycle(iterable)
  return cycle.next()

 >>> l = [1, 2, 3, 4]
 >>> cycle(l)
 1
 >>> cycle(l)
 2
 >>> cycle(l)
 3
 >>> cycle(l)
 4
 >>> cycle(l)
 1

但是我将如何重复每个元素呢?

编辑

为了澄清这一点,应该无限迭代。此外,我使用重复元素两次作为最短的示例 - 我真的很想将每个元素重复 n 次

更新

您的解决方案会引导我找到我正在寻找的东西吗:

>>> import itertools
>>> def ncycle(iterable, n):
...   for item in itertools.cycle(iterable):
...     for i in range(n):
...       yield item
>>> a = ncycle([1,2], 2)
>>> a.next()
1
>>> a.next()
1
>>> a.next()
2
>>> a.next()
2
>>> a.next()
1
>>> a.next()
1
>>> a.next()
2
>>> a.next()
2

感谢您的快速回答!

【问题讨论】:

    标签: python iterator


    【解决方案1】:

    这个怎么样:

    import itertools
    
    def bicycle(iterable, repeat=1):
        for item in itertools.cycle(iterable):
            for _ in xrange(repeat):
                yield item
    
    c = bicycle([1,2,3,4], 2)
    print [c.next() for _ in xrange(10)]
    

    编辑:合并bishanty's 重复计数参数和Adam Rosenfield's list comprehension

    【讨论】:

    • >>> import itertools >>> def ncycle(iterable, n): ... for item in itertools.cycle(iterable): ... for i in range(n): .. . 产量项目
    【解决方案2】:

    你可以很容易地用生成器来做:

    def cycle(iterable):
        while True:
            for item in iterable:
                yield item
                yield item
    
    x=[1,2,3]
    c=cycle(x)
    
    print [c.next() for i in range(10)]  // prints out [1,1,2,2,3,3,1,1,2,2]
    

    【讨论】:

    • 再说一次,我不是 100% 肯定已经理解了这个问题,但是对于像返回一个项目两次(或 n 次)这样的简单问题,生成器不是有点矫枉过正吗?
    • 5 行。这怎么可能是矫枉过正?如果替代方案是建立一个列表,那是不可能的,因为它是无限长的。
    • 为什么首先要创建一个函数?您可以使用简单的嵌套循环获得相同的结果,而无需生成器,阅读循环,即使是新手也可以立即理解代码的含义,而使用生成器您必须相信函数的名称。
    【解决方案3】:
    itertools.chain.from_iterable(itertools.repeat(item, repeat) for item in itertools.cycle(l))
    

    【讨论】:

      【解决方案4】:

      解决方案应该类似于

      iterable = [1, 2, 3, 4]
      n = 2
      
      while (True):
        for elem in iterable:
          for dummy in range(n):
            print elem # or call function, or whatever
      

      编辑:添加“While (True)”以无限期迭代。

      【讨论】:

        【解决方案5】:
        import itertools as it
        
        def ncycle(iterable, n=1):
            if n == 1:
                return it.cycle(iterable)
            return it.cycle(it.chain(*it.izip(*([iterable]*n))))
        

        【讨论】:

          【解决方案6】:

          我是这样做的:

          from itertools import cycle, repeat, chain
          flatten = chain.from_iterable # better name
          
          def ncycle(xs, n):
              return flatten(repeat(x, n) for x in cycle(xs))
          
          # example
          for n,x in enumerate(ncycle('abcd', 2)):
              print(x, end=" ")
              if n > 9:
                  print("")
                  break
          # output: a a b b c c d d a a b
          

          【讨论】:

            【解决方案7】:
            [ "%d, %d" % (i, i) for i in [1, 2, 3, 4] * 4]
            

            最后4个是周期数。

            【讨论】:

              猜你喜欢
              • 2015-01-17
              • 2015-12-25
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2022-11-01
              • 2016-09-21
              • 1970-01-01
              相关资源
              最近更新 更多