这是我想写的:
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-1
两次......我不知道如何压缩它。
这就是我提出的:
我在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()
就像我会用其他语言做的那样。
答案 0 :(得分:1)
技术上更紧凑,但不是更可读也不是更少DRY:
groups[m][n], gid = (groups[m-1][n], gid) if groups[m-1][n] else (gid+1, gid+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
内容...例如对象的属性或列表中的项目。
答案 1 :(得分: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
答案 2 :(得分:1)
如果你把gid生成放在一个函数中,你可以这样做。例如(使用全局范围):
gid = 0
def newgid(): global gid; gid += 1; return gid
现在你可以写:
groups[m][n] = groups[m - 1][n] or newgid()
当然最好将gid和newgid放在自己的类或其他方法所在的类中。