2

常に最後のループの項目から始まるいくつかのループでリストをループしたい:

import itertools as it
list1=[1,2,3,4,5,6,7,8]
a=iter(list1)
while a.next()!= 8:
    a,b=it.tee(a) #copy the iterator
    while b.next()!=8:
        b,c=it.tee(b)
        while c.next()!=8:
            print "yaaay"

このコードでは、外側のループの現在の反復子でループを開始できます。スライスを使用せずに、より Pythonic な方法でこれを行うにはどうすればよいですか?

これは、私がよりpythonicな方法で考えていることの例です:

list1=[1,2,3,4,5,6,7,8]
a=iter(list1)
for k1 in list1:
    for k2=k1 in list1:
        for k3=k2 in list1:
            print "yaaay"            
4

3 に答える 3

2

私の理解では、ある時点でジェネレーターの状態を「保存」してから「復元」する方法を探しています。使用するteeのは正しい考えです。PEP 0323にこれに関する詳細情報があります。

import itertools

lst = range(10)
it = iter(lst)

while True:
    print it.next(), '>>',
    it, saved = itertools.tee(it)
    for subitem in it:
        print subitem,
    it = saved
    print

アップデート:

import itertools

class fancy_it(object):
    stack = []

    def __init__(self, iterable=None):
        if not iterable:
            prev = fancy_it.stack[-1]
            prev.it, iterable = itertools.tee(prev.it)
        self.it = iter(iterable)

    def __iter__(self):
        fancy_it.stack.append(self)
        try:
            while True:
                yield self.it.next()
        except StopIteration:
            fancy_it.stack.pop()
            raise StopIteration


for x in fancy_it(range(10)):
    print x
    for y in fancy_it():
        print '**', y
        for z in fancy_it():
            print '****', z
于 2012-05-12T20:04:50.793 に答える
2

を試すことができますitertools.combinations_with_replacement。これは、同じ要素のセットをループしますが、3 つではなく単一の for ループになります。

import itertools
list1 = [1,2,3,4,5,6,7,8]
for k1, k2, k3 in itertools.combinations_with_replacement(list1, 3):
     print k1, k2, k3

再び 3 つの for ループに相当するものに変えるには、次のitertools.groupbyように使用できます。

import itertools
import operator

list1 = [1,2,3,4,5]
combos = itertools.combinations_with_replacement(list1, 3)

for k1, k1_groups in itertools.groupby(combos, operator.itemgetter(0)):
    for k2, k2_groups in itertools.groupby(k1_groups, operator.itemgetter(1)):
        print k1, k2, '==>',
        for _, _, k3 in k2_groups:
            print k3,
        print

これは印刷されます

1 1 ==> 1 2 3 4 5
1 2 ==> 2 3 4 5
1 3 ==> 3 4 5
1 4 ==> 4 5
1 5 ==> 5
2 2 ==> 2 3 4 5
2 3 ==> 3 4 5
2 4 ==> 4 5
2 5 ==> 5
3 3 ==> 3 4 5
3 4 ==> 4 5
3 5 ==> 5
4 4 ==> 4 5
4 5 ==> 5
5 5 ==> 5
于 2012-05-12T20:05:04.940 に答える
0
l = [...]
for i, k1 in enumerate(l):
    for i, k2 in enumerate(l[i:]):
        # this loop skippes the elements after k1
        ...
于 2012-05-12T20:07:13.920 に答える