2

len(a) == len および for every の場合、「a」は「l」のメンバーになることができます"a" の member(lets call p)、p[0] <= max および p[1] <= max

たとえば、poslist_all(max=2,len=1)

[[(1,1)],[(1,2)],[(2,1)],[(2,2)]]

および poslist_all(2,2)

[[(1,1),(1,1)],[(1,1),(1,2)],[(1,1),(2,1)],[(1,1),(2,2)],...,[(2,2),(1,1)],[(2,2),(1,2)],[(2,2),(2,1)],[(2,2),(2,2)]]

だから私はそのリストをイテレータにしようとしていて、このコードを思いついた、

class poslist_all:
    def __init__(self,max,len):
        self.max = max
        self.len = len
        self.iposlist = len*[(1,1)]
    def __iter__(self):
        return self
    def __next__(self):
        ml = self.maxlist()
        if ml:
            if ml[0] == 0:
                raise StopIteration
            else:
                toinc = ml[0]-1
                self.inc(ml[0] - 1)
                for i in range(ml[0],self.len-1):
                    self.iposlist[i] = (1,1)
                return self.iposlist
        else:
            self.inc(self.len - 1)
            return self.iposlist
    def maxlist(self):
        return [x for x,y in enumerate(self.iposlist) if y == (self.max,self.max)]
    def inc(pnum):
        if self.iposlist[pnum][1] == self.max:
            return (self.iposlist[pnum][0]+1,1)
        else:
            return (self.iposlist[pnum][0],self.iposlist[pnum][1]+1)

if __name__ == "__main__":
    for ps in poslist_all(2,2):
        print(ps)

しかし、これは常に返されます

Traceback (most recent call last):
  File "./helper.py", line 33, in <module>
    for ps in poslist_all(2,2):
  File "./helper.py", line 22, in __next__
    self.inc(self.len - 1)
TypeError: inc() takes 1 positional argument but 2 were given

このエラーの原因は何ですか? それを解決する方法? これを行うためのよりpythonicな方法はありますか?

4

3 に答える 3

4

他の人がエラーを取り除く方法を示しましたが、実際の問題に対処したいと思います。

実際、あなたが望むことを行うためのより良い、よりPythonicな方法があります。itertoolsモジュール、具体的にはitertools.product ()を使用すると、このタスクがはるかに簡単になります。

import itertools as it

def create_possibilities(highest, per_list):
    tuples = it.product(range(1, highest+1), repeat=highest)
    all_possibilities = it.product(tuples, repeat=per_list)
    return all_possibilities

これは、イテレータよりもイテレータを返します(少なくとも正しい用語に近いと思います)。
実際のリストが必要な場合は、必要に応じてlist()関数を使用してください。

maxまた、 andlenはひどい変数名であることに注意してください。それらは python のビルトイン関数を隠します。

于 2013-09-20T19:01:34.793 に答える