如何在Python中迭代列表并重复每个元素

8

我将使用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

感谢您的快速回答!
7个回答

13
这样怎么样:
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的重复计数参数和Adam Rosenfield的列表推导式。


import itertools def ncycle(iterable, n): ... for item in itertools.cycle(iterable): ... for i in range(n): ... yield item
- jb.

6
您可以很容易地使用生成器来完成这项任务:
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]

再次声明,我并不完全确定是否理解了这个问题,但是像返回一个项目两次(或n次)这样的简单问题,生成器是否有点过度设计? - rob
这只有5行代码,怎么可能过度了呢?如果另一种替代方法是建立一个列表,那是不可能的,因为它的长度是无限的。 - recursive
为什么要首先创建一个函数呢?你可以通过简单的嵌套循环达到相同的结果,而不需要使用生成器。阅读循环时,即使是一个初学者也能立即理解代码的含义,而使用生成器则需要相信函数的名称。 - rob

2
itertools.chain.from_iterable(itertools.repeat(item, repeat) for item in itertools.cycle(l))

1
我这样做:
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

1

解决方案应该是这样的

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)”以无限迭代。


1
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))))

0
[ "%d, %d" % (i, i) for i in [1, 2, 3, 4] * 4]

最后的4是循环次数。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接