大家好:我现在在python中遇到了一个很棘手的问题,我不知道如何修复它,希望任何人都可以解释一下。
问题如下:
我有一个dict(),我们称它为D. D中的键是整数对(i,j),表示单位正方形中心的坐标,对应于(i,j)的值是其中一种颜色('r','g','b')。
在我的程序中,我必须经常检查2x2正方形是否都是“红色”,如果是,那么将它们的颜色改为“蓝色”,我必须写一下:
if (D[(i, j)] == 'red'
and D[(i, j+1)] == 'red'
and D[(i+1, j)] == 'red'
and D[(i+1, j+1)] == 'red'):
D[(i, j)] = .. = 'blue'
嗯,实际情况比较复杂,上面只是一个例子。
我必须多次写这种类型的代码:如果全是红色,如果全是蓝色,如果有些蓝色有些红色,......我疯了!所以我决定写
block = [[D[(i,j)], D[(i, j+1)], D[(i, j+1)], D[(i+1, j+1)]]
if block == ['red', 'red', 'red', 'red']:
block = ['blue', 'blue', 'blue', 'blue']
当然这不起作用,因为当重新分配值到阻止时,原始集合不会改变:D [(i,j)]仍然是“红色”。
所以我的问题是:如何在我的情况下有效地修改子集?更确切地说,我必须从dict中取出一些(键,值)对,将它们存储在临时变量(或数据结构)中,检查和修改这些变量,并希望在我改变时也改变原始的dict变量。但它总是以我预期的方式运作。
答案 0 :(得分:1)
您可以通过这种方式调整您的想法,使其发挥作用:
block = [(i,j), (i, j+1), (i, j+1), (i+1, j+1)]
if all(D[coord]=='red' for coord in block):
for coord in block:
D[coord] = 'blue'
答案 1 :(得分:0)
为什么你不只是在做功能?
def is_2x2red(squares,x,y):
return (squares[(x,y)]=='r' and squares[(x,y+1)]=='r' and
squares[(x+1,y)]=='r' and squares[(x+1,y+1)]=='r')
和一个用于分配蓝色?
def blue2x2(squares,x,y):
squares[(x,y)]='b'
squares[(x,y+1)]='b'
squares[(x+1,y)]='b'
squares[(x+1,y+1)]='b'
然后只是全身使用它们?
if is_red2x2(squares,i,j): blue2x2(squares,i,j)
您可以将这些功能组合到一个功能中,甚至可以缩短通话时间。
修改强> 如果您需要将此工作量超过2x2,并且仅供将来参考,则应检查和分配检查和分配,例如检查:
def is_red2x2(squares,x,y,n=1):
return reduce(lambda x,y: = x*y,(squares[(i,j)]=='r'
for i in range(x,x+n+1) for j in range(y,y+n+1)))