1

書きたいことは次のとおりです。

groups[m][n] = groups[m - 1][n] or ++gid

ここに私が書かなければならないものがあります:

g = groups[m - 1][n]
if g:
    groups[m,n] = g
else:
    gid += 1
    groups[m][n] = gid

++演算子がないという理由だけで、Python でこれをコンパクトに記述する方法はありませんか?


私が取り組んでいる方法からのより大きなサンプル:

groups = [[0] * self.columns] * self.rows
gid = 0
for m in xrange(self.rows):
    for n in xrange(self.columns):
        stone = self[m, n]
        if stone == self[m - 1, n]:
            if groups[m - 1][n]:
                groups[m][n] = groups[m - 1][n]
            else:
                gid += 1
                groups[m][n] = gid
        elif stone == self[m, n - 1]:
            if groups[m][n - 1]:
                groups[m][n] = groups[m][n - 1]
            else:
                gid += 1
                groups[m][n] = gid

そのように吹き飛ばさなければならないときは、読むのがずっと難しいと思います。さらに、m-12回評価しています...どうすればそれを要約できるかわかりません。


これは私が思いついたものです:

私は周りにラッパークラスを作成しましたint:

class Int(object):
    def __init__(self, i):
        self.i = i

    def pre(self, a=1):
        self.i += a
        return Int(self.i)

    def post(self, a=1):
        cpy = Int(self.i)
        self.i += a
        return cpy

    def __repr__(self):
        return str(self.i)

    def __nonzero__(self):
        return self.i != 0

次のように使用できます。

def group_stones(self):
    groups = [[None for _ in xrange(self.cols)] for _ in xrange(self.rows)]
    gid = Int(0)
    for m in xrange(self.rows):
        for n in xrange(self.cols):
            stone = self[m, n]
            if stone == self[m - 1, n]:
                groups[m][n] = groups[m - 1][n] or gid.pre()
            elif stone == self[m, n - 1]:
                groups[m][n] = groups[m][n - 1] or gid.pre()
            else:
                groups[m][n] = gid.pre()

私が他の言語で行うのと同じように。

4

3 に答える 3

1
gid = [0] # list - mutable object

def incremented(gid):
    gid[0] += 1
    return gid[0]

groups[m][n] = groups[m - 1][n] or incremented(gid)

Int クラスに「魔法」を追加できます。

class C(object):
    ...
    def __add__(self, other):
        self.i += other
        return self.__class__(self.i)
    def __radd__(self, other):
        cpy = self.__class__(self.i)
        self.i += other
        return cpy

>>> print Int(2) + 1 # pre
3
>>> i = Int(2)
>>> print 1 + i # post
2
>>> print i
3
于 2012-07-01T07:14:53.033 に答える
1

gid 生成を関数に入れると、それが可能になります。例 (グローバル スコープを使用):

gid = 0
def newgid(): global gid; gid += 1; return gid

これで、次のように記述できます。

groups[m][n] = groups[m - 1][n] or newgid()

もちろん、gid と newgid を独自のクラスまたは他のメソッドがあるクラスに配置する方がよいでしょう。

于 2012-07-01T07:19:30.647 に答える
1

技術的にはよりコンパクトですが、実際には読みやすくも DRY も劣っていません:

groups[m][n], gid = (groups[m-1][n], gid) if groups[m-1][n] else (gid+1, gid+1)

コンパクトではなく(少なくとも1回の使用の場合)、読みやすくなります:

def test_or_inc(val, accum):
    return (val, accum) if val else (accum+1, accum+1)

groups[m][n], gid = test_or_inc(groups[m-1][n], gid)

別のオプションは、オブジェクトのプロパティやリスト内の項目など、参照渡しできるgidものを作成することです。

于 2012-07-01T07:02:46.450 に答える