Как перебирать список, повторяя каждый элемент в Python
Я использую 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 ответов
Как насчет этого:
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)]
EDIT: incorporated bishanty это!--5--> повторите параметр count и понимание списка Адама Розенфилда.
вы могли бы сделать это с генератором довольно легко:
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]
решение должно быть что-то вроде
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
Edit: добавлено 'While (True)' для бесконечного повторения.
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))))
Я делаю это так:
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
