3

イテレータの異なるインデックス位置から複数の任意の値を取得するにはどうすればよいですか?

リスト内のジェネレーターの次のn個の値を取得する方法(python)およびPythonでジェネレーターのn番目の項目を取得するitertools.islice方法では、イテレーターから任意の要素または連続サブセットを取得するための使用について説明します。しかし、イテレータのさまざまな位置から複数の任意の要素が必要な場合はどうなりisliceますか?ここで、のステップ引数を使用することはできません。

私はプロジェクトオイラーの問題40を解決しようとしています。連結された整数の文字列を生成しました

iteration = (i for i in ''.join(map(str, (i for i in xrange(1,10**6)))))

ここで、インデックス1、10、100、1000、10000、100000、1000000の要素を1から数えて取得したいと思います。をislice呼び出すたびにnext現在の値が右にシフトするため、ここでは使用できませんでした。例えば

next(islice(iteration, 1, 2)) + next(islice(iteration, 3, 4))

'24'の代わりに'26'を生成します。

更新(25.11.12、4:43 UTC + 0)

すべての提案をありがとう。私の現在のコードは次のようになります:

it = (i for i in ''.join(map(str, (i for i in xrange(1,10**6)))))
ds = [int(nth(it, 10**i-10**(i-1)-1)) for i in range(7)]
return product(ds)

の醜い議論nthは、0、8、89、899、8999などのシーケンスを生成することです。

4

3 に答える 3

4

(オイラー番号 40 を解くにはもっと速い方法があることに注意してください。)

私は少し違う働き方をします。を使用する代わりにnth:

>>> from itertools import chain, count, islice
>>> 
>>> it = chain.from_iterable(str(i) for i in count(1))
>>> wanted = {10**i for i in range(7)}
>>> scan_region = islice(it, max(wanted)+1)
>>> digits = [int(x) for i, x in enumerate(scan_region, 1) if i in wanted]
>>> digits
[1, 1, 5, 3, 7, 2, 1]

この方法では、適切なインデックスがあることを確認するために減算を行う必要はありません。

于 2012-11-25T16:41:05.910 に答える
1

前述のように見るだけでなくnth、ジェネレーターを単純化することも検討します。

from itertools import count

def concat():
    for i in count(1):
        for j in str(i):
            yield int(j)
于 2012-11-25T16:37:51.777 に答える
1

これはitertools documentation の「レシピ」セクションからのものです。nのth 要素を返し、iterableそれを消費します。

def nth(iterable, n, default=None):
    "Returns the nth item or a default value"
    return next(islice(iterable, n, None), default)

順番に呼び出すことで、1 番目、10 番目、100 番目などの要素を取得できます (イテレータが消費され、インデックスがゼロであることに注意してください)。

first = nth(iteration, 0)
tenth = nth(iteration, 8)  # since we've already taken one
hundredth = nth(iteration, 89)  # since we've already taken ten
# etc

または、毎回異なるイテレータteeを使用して使用することもできます。nthこのようにして、単一のイテレータが消費されるという事実を心配する必要はありません。一方、イテレータが非常に長い場合、メモリを飲み込み始める可能性があります。

于 2012-11-25T16:24:29.910 に答える