8

私は Python を使用してリストを無限に繰り返し、リスト内の各要素を何度も繰り返しています。たとえば、次のリストが与えられます。

l = [1, 2, 3, 4]

各要素を 2 回出力してから、サイクルを繰り返したいと思います。

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

しかし、各要素をどのように繰り返すのでしょうか?

編集

これを明確にするために、無限に繰り返す必要があります。また、最短の例として要素を 2 回繰り返すことを使用しました 。各要素を 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

素早い回答ありがとうございます。

4

7 に答える 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 の list comprehensionを組み込みました。

于 2008-12-20T18:36:27.197 に答える
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]
于 2008-12-20T18:31:49.577 に答える
2
itertools.chain.from_iterable(itertools.repeat(item, repeat) for item in itertools.cycle(l))
于 2016-04-09T10:30:56.897 に答える
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))))
于 2008-12-22T16:32:41.080 に答える
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)」を追加しました。

于 2008-12-20T18:30:05.603 に答える
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
于 2017-10-24T23:38:20.713 に答える
0
[ "%d, %d" % (i, i) for i in [1, 2, 3, 4] * 4]

最後の 4 つはサイクル数です。

于 2008-12-20T18:40:13.150 に答える