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

时间:2017-12-01 06:16:18

标签: python arrays

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

  1. 如果列表中的值为负数,并且它们是位于其上方的列表,并且在同一位置具有正值。它应该将一切都降低,导致负值消失。

  2. 如果上面没有任何列表,或者上面列表中的相应值只是0.它会将负值替换为0.

  3. 注意:正值不应该消失,它们只能在需要时向下移动。只有负值(低于-100)消失。

    这些例子应该更好地解释它:

    情景1:

    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]]

    情景2:

    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]]

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

    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]]

    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 :(得分:1)

我单独使用列,而不是使用完整行。

  • 从下到上搜索列
  • 找到负值
  • 上方找到正值(大于零)
  • 如果没有找到,则将零代替否定
  • 如果找到则
  • 然后向上移动所有值 将above移至rowabove-1移至row-1above-2移至row-2等。

BTW:当行显示在另一个下面时,搜索解决方案会更容易。

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()

结果:

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]

debug: negative: -103
debug: move down 4 element(s)
debug: negative: -103
debug: move down 4 element(s)
debug: negative: -103
debug: move down 4 element(s)

result:
[[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]]
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]]
expect == result: True
---
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]

debug: negative: -101
debug: put zero
debug: negative: -101
debug: put zero
debug: negative: -101
debug: put zero

result:
[[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]]
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]]
expect == result: True
---
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]

debug: negative: -102
debug: move down 3 element(s)
debug: negative: -102
debug: move down 3 element(s)
debug: negative: -102
debug: move down 3 element(s)

result:
[[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]]
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]]
expect == result: True
---

答案 1 :(得分:0)

这是一个简单的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]]