Python 矩阵元素的移位和合并
如何移动和合并矩阵元素以获得以下结果 右移:Python 矩阵元素的移位和合并,python,python-3.x,Python,Python 3.x,如何移动和合并矩阵元素以获得以下结果 右移: [[0,0,2,2,0,2],[8,4,2,2,0,2]]==>[[0,0,0,0,4,2],[0,0,8,4,4,2] 或 向左移动: [[0,0,2,2,0,2],[8,4,2,2,0,2]。==>[[4,2,0,0,0,0],[8,4,4,2,0,0]。 就像2048年的比赛。例如,当用户向左移动时,每个数字都会移动到列表的左侧,如果并排的两个数字相等,则tere是两个数字的相加 我想做它与循环 我尝试了一些在互联网上找到的代码,但作为初学者,
[[0,0,2,2,0,2],[8,4,2,2,0,2]]
==>[[0,0,0,0,4,2],[0,0,8,4,4,2]
或
向左移动:
[[0,0,2,2,0,2],[8,4,2,2,0,2]。
==>[[4,2,0,0,0,0],[8,4,4,2,0,0]。
就像2048年的比赛。例如,当用户向左移动时,每个数字都会移动到列表的左侧,如果并排的两个数字相等,则tere是两个数字的相加
我想做它与循环
我尝试了一些在互联网上找到的代码,但作为初学者,我没有找到一个简单的代码来理解如何做到这一点
提前感谢您的帮助。如果我没有误解您的意思,我将编写一些代码,希望这对您有所帮助:
a = [[0, 0, 2, 2, 0, 2], [8, 4, 2, 2, 0, 2]]
f = lambda x: [2 * x[0]] if x[0] == x[1] else x
def move_left(l):
c, l = [], l + [0] if len(l) % 2 else l
for i in range(0, len(l), 2):
c = c + f(l[i:i + 2])
c = list(filter(lambda x: x != 0, c))
return c + ([0] * (len(l) - len(c)))
def move_right(l):
c, l = [], l + [0] if len(l) % 2 else l
for i in range(len(l), 0, -2):
c = f(l[i - 2:i]) + c
c = list(filter(lambda x: x != 0, c))
return ([0] * (len(l) - len(c))) + c
for i in a:
print(move_left(i))
输出:
[4, 2, 0, 0, 0, 0]
[8, 4, 4, 2, 0, 0]
似乎您正在使用Python3.x,因此应该使用
list(filter(lambda x:x!=0,c))
来获取列表。下面是一个将元素向右移动的示例:
def move_right(matrix):
for row in matrix:
for i, number in reversed(list(enumerate(row))):
if number == row[i-1]:
row[i] = number + row[i-1]
row[i-1] = 0
row.sort(key=lambda v: v != 0)
return matrix
然后做:
matrix = [[0,0,2,2,0,2],[8,4,2,2,0,2]]
print(move_right(matrix))
产出:
[[0, 0, 0, 0, 4, 2], [0, 0, 8, 4, 4, 2]]
工作原理:
row=[0,0,2,2,0,2]
例如:[4,4,8]=>[0,8,8]=>[0,0,16]。这实际上应该等于[0,0,8]
对于当前行,这将输出如下结果:
i编号
5 2
4 0
3 2
2 2
1 0
0 0
[0,0,0,4,0,2]
。然后,代码row.sort(key=lambda v:v!=0)
将进行排序,以便将零推到左侧。有关更多详细信息,请参阅。
将元素向左而不是向右移动时,需要将其更改为row.sort(key=lambda v:v!=0,reverse=True)
以将零推向另一个方向请解释你想做什么。你的输入和输出没有明显的模式。(我注意到您为相同的输入提供了两个示例输出。)谢谢您的建议。我改进了我的解释是的,就是这样。:)移动
[1,1,1]
有什么作用?是[0,1,2]
还是[0,2,1]
?向左移动?如果你向左移动[1,1,1],结果将是[2,1,0],向右移动[0,1,2]。range(0,len(l),2)
将使结果更容易阅读。我在执行代码时出现了这个错误:(在move_left return c+([0]*(len(l)-len(c)))TypeError:type'filter'的对象没有len()
您的代码运行得很好,但您能解释一下下面这行代码的作用吗?行.sort(key=lambda v:v!=0)
查看此链接。如果您仍然有问题可以提问。是否有方法将矩阵中的所有0移动到顶部或底部?例如:[0,0,0,0]、[0,0,0,0]、[1,1,1,1]、[0,0,0,0,0]、[0,0,0,0,0]、[0,0,0,0]、[0,0,0,0]、[0,0,0,0]、[0,0,0,0,0]、[0,0,0,0,0,0]、[0,0,0,0,0,0]、[0,0,0,0,0]、[0,0,0,0,0,0]、[0,0,0,0,0,0,0]、[0,0,0,0.我是通过一个循环完成的,但我想知道是否有内置函数来完成。:)我使用了你的函数,但它似乎有问题。例如,对于下列矩阵[[0,0,0],[4,4,8],[0,0,0]],它返回我[[0,0,0],[0,0,16],[0,0,0]],而不是[[0,0,0],[0,8,8],[0,0,0]],因为行的最后一个数将等于前一个数。我怎样才能修好它?:)不错,我更新了答案中的代码。如果您还有任何问题,请告诉我。