Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 矩阵元素的移位和合并_Python_Python 3.x - Fatal编程技术网

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]
  • 然后我们使用enumerate()函数检查该行中的数字。然后,我们应用reversed()向后遍历列表,以避免在一次循环中将上一个和与另一个元素合并。
    例如:[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
    

  • 然后我们使用索引(i)引用列表中的前一个数字。e、 g.在指数2。当前的数字是2,而之前的数字(i-1)是2。由于它们相等,“if”语句中的代码将执行

  • 然后,将当前元素分配给其自身和前一个元素的总和<代码>行[i]=编号+行[i-1]

  • 前一个数字将变为0,并与当前数字合并<代码>行[i-1]=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]],因为行的最后一个数将等于前一个数。我怎样才能修好它?:)不错,我更新了答案中的代码。如果您还有任何问题,请告诉我。