Python-在二维数组中移位/删除元素

Python-在二维数组中移位/删除元素,python,arrays,Python,Arrays,我需要帮助移动和删除二维数组中的元素 如果列表中的值为负值,且其上方的列表中的正值位于同一位置。它应该将所有内容向下移动,导致负值消失 如果上面没有任何列表,或者上面列表中的相应值仅为0。它将用0替换负值 注意:正值永远不会消失,它们只能在需要时向下移动。只有负值(低于-100)消失 这些例子应该能更好地解释这一点: 场景1: 数据:[[0,0,0,0,0],[0,0,0,0,0],[1,2,1,0,0],[2,1,2,0,0],-103,103,0,0]。 def move(data):

我需要帮助移动和删除二维数组中的元素

  • 如果列表中的值为负值,且其上方的列表中的正值位于同一位置。它应该将所有内容向下移动,导致负值消失

  • 如果上面没有任何列表,或者上面列表中的相应值仅为0。它将用0替换负值

  • 注意:正值永远不会消失,它们只能在需要时向下移动。只有负值(低于-100)消失

    这些例子应该能更好地解释这一点:

    场景1:

    数据:
    [[0,0,0,0,0],[0,0,0,0,0],[1,2,1,0,0],[2,1,2,0,0],-103,103,0,0]。

    def move(data):
    
        c_count = 4
    
        while c_count >= 0:
    
            count = len(data) - 1
            prev = count - 1
    
            while count > 0 and prev >= 0:
                if data[count][c_count] < -100:
    
                    while prev >= 0 and data[prev][c_count] == 0:
                        prev -= 1
    
                    data[count][c_count] = data[prev][c_count]
                    data[prev][c_count]= 0
    
                count -= 1
                prev -= 1
    
            c_count -= 1
    
        return data
    
    my_data = [[0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [1, 3, 1, 0, 0], [-102, -102, -102, 0, 0], [3, 1, 3, 0, 0]] 
    x = move(my_data) # This is (scenario 3) is the only one that works. 
    print(x)
    
    预期:
    [[0,0,0,0,0],[0,0,0,0,0],[0,0,0,0,0],[1,2,1,0,0],[2,1,2,0,0]

    def move(data):
    
        c_count = 4
    
        while c_count >= 0:
    
            count = len(data) - 1
            prev = count - 1
    
            while count > 0 and prev >= 0:
                if data[count][c_count] < -100:
    
                    while prev >= 0 and data[prev][c_count] == 0:
                        prev -= 1
    
                    data[count][c_count] = data[prev][c_count]
                    data[prev][c_count]= 0
    
                count -= 1
                prev -= 1
    
            c_count -= 1
    
        return data
    
    my_data = [[0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [1, 3, 1, 0, 0], [-102, -102, -102, 0, 0], [3, 1, 3, 0, 0]] 
    x = move(my_data) # This is (scenario 3) is the only one that works. 
    print(x)
    
    场景2:

    数据:
    [[0,0,0,0,0],[0,0,0,0,0,0,0,0,0],[0,2,-101,-101],[0,1,2,3,2,2],[0,3,3,2,3]

    预期:
    [[0,0,0,0,0],[0,0,0,0,0],[0,2,0,0,0],[0,1,2,3,2],[0,3,3,2,3]

    场景3:(这是我在下面的代码中得到的唯一一个。)

    数据:
    [[0,0,0,0,0],[0,0,0,0,0],[1,3,1,0,0],-102,102,0,0],[3,1,3,0,0]。

    def move(data):
    
        c_count = 4
    
        while c_count >= 0:
    
            count = len(data) - 1
            prev = count - 1
    
            while count > 0 and prev >= 0:
                if data[count][c_count] < -100:
    
                    while prev >= 0 and data[prev][c_count] == 0:
                        prev -= 1
    
                    data[count][c_count] = data[prev][c_count]
                    data[prev][c_count]= 0
    
                count -= 1
                prev -= 1
    
            c_count -= 1
    
        return data
    
    my_data = [[0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [1, 3, 1, 0, 0], [-102, -102, -102, 0, 0], [3, 1, 3, 0, 0]] 
    x = move(my_data) # This is (scenario 3) is the only one that works. 
    print(x)
    
    预期:
    [[0,0,0,0,0],[0,0,0,0,0],[0,0,0,0,0],[1,3,1,0,0],[3,1,3,0,0]

    def move(data):
    
        c_count = 4
    
        while c_count >= 0:
    
            count = len(data) - 1
            prev = count - 1
    
            while count > 0 and prev >= 0:
                if data[count][c_count] < -100:
    
                    while prev >= 0 and data[prev][c_count] == 0:
                        prev -= 1
    
                    data[count][c_count] = data[prev][c_count]
                    data[prev][c_count]= 0
    
                count -= 1
                prev -= 1
    
            c_count -= 1
    
        return data
    
    my_data = [[0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [1, 3, 1, 0, 0], [-102, -102, -102, 0, 0], [3, 1, 3, 0, 0]] 
    x = move(my_data) # This is (scenario 3) is the only one that works. 
    print(x)
    
    def移动(数据):
    c_计数=4
    当c_计数>=0时:
    计数=长度(数据)-1
    prev=计数-1
    当计数>0且上一次大于等于0时:
    如果数据[计数][c_计数]<-100:
    当prev>=0且数据[prev][c_count]=0时:
    prev-=1
    数据[count][c_count]=数据[prev][c_count]
    数据[上一次][c_计数]=0
    计数-=1
    prev-=1
    c_计数-=1
    返回数据
    my_data=[[0,0,0,0,0],[0,0,0,0,0],[1,3,1,0,0],-102,-102,0,0],[3,1,3,0,0]]
    x=移动(我的数据)#这是(场景3)唯一有效的方法。
    打印(x)
    

    非常感谢你的帮助!我已经在这上面呆了一段时间了

    这里有一个简单的numpy方法,即

    import numpy as np 
    def get_arr(arr):
        arr = np.array(arr)
        arr[arr<1] = 0
        new_arr = arr[np.argsort(arr.sum(1)),:]
        return new_arr.tolist()
    
    arr = [[0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [1, 2, 1, 0, 0], [2, 1, 2, 0, 0], [-103, -103, -103, 0, 0]]
    arr1 = [[0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 2, -101, -101, -101], [0, 1, 2, 3, 2], [0, 3, 3, 2, 3]]
    arr2 = [[0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [1, 3, 1, 0, 0], [-102, -102, -102, 0, 0], [3, 1, 3, 0, 0]]
    
    print(get_arr(arr))
    print(get_arr(arr1))
    print(get_arr(arr2))
    #[[0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [1, 2, 1, 0, 0], [2, 1, 2, 0, 0]]
    #[[0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 2, 0, 0, 0], [0, 1, 2, 3, 2], [0, 3, 3, 2, 3]]
    #[[0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [1, 3, 1, 0, 0], [3, 1, 3, 0, 0]]
    
    将numpy导入为np
    def get_arr(arr):
    arr=np.数组(arr)
    
    arr[arr我分别处理列,而不是整行

    • 在列中从下到上搜索
    • 求负值
    • 找到上面的正值(大于零)
    • 如果找不到,则用零代替负数
    • 如果找到,则向下移动上面的所有值
      将上面的
      移动到
      在-1上方
      移动到
      第1行
      在-2上方
      移动到
      第2行
      ,等等
    顺便说一句:当一行显示在另一行下面时,搜索解决方案更容易

    def move(data):
    
        # work in column, not with full rows
        for col in range(len(data)):
    
            # move from bottom to top
            for row in range(len(data[0])-1, -1, -1):
    
                # check if negative value
                if data[row][col] < 0:
                    print('debug: negative:', data[row][col])
    
                    # find positive value above
                    above = row-1
                    while above > -1 and data[above][col] <= 0:
                        above -= 1
    
                    # check if found positive value 
                    if above == -1:
                        # put zero if not found value above
                        print('debug: put zero')
                        data[row][col] = 0
                    else:
                        # move down all values above 
                        print('debug: move down', above+1, 'element(s)')
                        while above > -1:
                            data[row][col] = data[above][col]
                            data[above][col] = 0
                            row -= 1
                            above -= 1
    
        return data
    
    # --- function to run one scenario, display data and check result ---
    
    def run(data, expect):
        print('data:')
        print('\n'.join(str(row) for row in data))
        print()
        result = move(data)
        print()
        print('result:')
        print(result)
        print('expect:')
        print(expect)
        print('expect == result:', expect == result)
        print('---')
    
    # --- scenarios ---
    
    def scenario1():
    
        DATA = [
            [0, 0, 0, 0, 0], 
            [0, 0, 0, 0, 0], 
            [1, 2, 1, 0, 0], 
            [2, 1, 2, 0, 0], 
            [-103, -103, -103, 0, 0]
        ]
    
        EXPECT = [
            [0, 0, 0, 0, 0], 
            [0, 0, 0, 0, 0], 
            [0, 0, 0, 0, 0], 
            [1, 2, 1, 0, 0], 
            [2, 1, 2, 0, 0]
        ]
    
        run(DATA, EXPECT)
    
    def scenario2():
    
        DATA = [
            [0, 0, 0, 0, 0], 
            [0, 0, 0, 0, 0], 
            [0, 2, -101, -101, -101], 
            [0, 1, 2, 3, 2], 
            [0, 3, 3, 2, 3]
        ]
    
        EXPECT = [
            [0, 0, 0, 0, 0], 
            [0, 0, 0, 0, 0], 
            [0, 2, 0, 0, 0], 
            [0, 1, 2, 3, 2], 
            [0, 3, 3, 2, 3]
        ]
    
        run(DATA, EXPECT)
    
    def scenario3(): #(This is the only one that I got working in my code below.)
    
        DATA = [
            [0, 0, 0, 0, 0], 
            [0, 0, 0, 0, 0], 
            [1, 3, 1, 0, 0], 
            [-102, -102, -102, 0, 0], 
            [3, 1, 3, 0, 0]
        ]
    
        EXPECT = [
            [0, 0, 0, 0, 0], 
            [0, 0, 0, 0, 0], 
            [0, 0, 0, 0, 0], 
            [1, 3, 1, 0, 0], 
            [3, 1, 3, 0, 0]
        ]
    
        run(DATA, EXPECT)
    
    # --- start scenarios ---
    
    scenario1()
    scenario2()
    scenario3()
    

    非常感谢,但我正在寻找一种不需要导入函数的解决方案。ThanksThanks Furas!但是行/列的数量并不总是相同的。是否可以调整此值,以便在这些情况下工作?Thanksit使用
    len(数据)
    len(数据[0])
    ,因此它应该适用于任何大小。