下面是我想写的:
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()
就像我用其他语言一样。你知道吗
如果你把gid生成放在一个函数中,你就可以做到这一点。例如(使用全局范围):
现在你可以写:
当然,最好将gid和newgid放在自己的类中,或者放在其他方法所在的类中。你知道吗
您可以为Int类添加一些“魔力”:
技术上更紧凑,但实际上不可读,也不干燥:
不那么紧凑(至少用于一次使用),可读性更强:
另一个选择是使
gid
成为您可以通过引用传递的东西。。。例如对象的属性或列表中的项。你知道吗相关问题 更多 >
编程相关推荐