Python - 将元素移动到二维数组的末尾?

时间:2017-11-26 23:34:02

标签: python list

鉴于此2D数组 - [[0,0, -1 ],[1,0, -2 ],[2,0, - 3 ],[3,0,0]]

如何在Python中编写可以将所有内容移动到最后的内容? (如果结尾为空)。

所以我得到这样的东西 - [[0,0,0],[1,0, -1 ],[2,0, -2 ] ,[3,0, -3 ]]

我试过这样的事情:

count = 0
while count < row: # row is 4 in this case. 
    if my_array[row-1][2] == 0:
        tp = my_array[count][2]
        my_array[count][2] = 0
        my_array[count+1][2] = tp
    else:
        break
    count += 1
return my_array

但这是我得到的: [[0,0,0],[0,0,0],[0,0,0],[0,0,-1]]

更新

谢谢@furas,我花了好几个小时试图解决这个问题 我怎样才能处理中间的差距?所以,如果我得到这样的东西:

data = [[0, 0, -1], [0, 0, 0], [0, 0, -3], [0, 0, -4]]

expected = [[0, 0, 0], [0, 0, -1], [0, 0, -3], [0, 0, -4]]

rows = len(data)

if data[-1][-1] == 0:
    count = rows-1
    while count > 0:
        data[count][-1] = data[count-1][-1]
        count -= 1
    data[0][-1] = 0

print(data)
print(expected)
print(data == expected) # False

由于

11月29日更新 -

我有某些类似的情况不起作用?你能帮忙吗?

DATA :[[0,0,0,0],[1,2,1,0],[2,1,2,0],[0,0,0, 0]]

EXPECT :[[0,0,0,0],[0,0,0,0],[1,2,1,0],[2,1,2, 0]]

或者如果它是否定的:

DATA :[[0,0,0,0],[ - 101,-101,-101,0],[2,3,2,0],[3,2] ,3,0]]

EXPECT :[[0,0,0,0],[0,0,0,0],[2,3,2,0],[3,2,3, 0]]

非常感谢!!

2 个答案:

答案 0 :(得分:1)

我有类似的东西

def move(data):  
    row = len(data)-1
    prev = row-1

    while row > 0 and prev >= 0:
        if data[row][-1] == 0:
            while prev >= 0 and data[prev][-1] == 0:
                prev -= 1
            data[row][-1] = data[prev][-1]
            data[prev][-1] = 0
        row -= 1
        prev -= 1        

    return data

# --- test ---

examples = [
  {
    'data': [[0, 0, -1], [0, 0, 0], [0, 0, -3], [0, 0, -4]],
    'expected': [[0, 0, 0], [0, 0, -1], [0, 0, -3], [0, 0, -4]],
   },
  {
    'data': [[0, 0, -1], [1, 0, -2], [2, 0, -3], [3, 0, 0]],
    'expected': [[0, 0, 0], [1, 0, -1], [2, 0, -2], [3, 0, -3]],
   },
]

for ex in examples:
    print(ex['data'])
    result = move(ex['data'])
    print(ex['expected'])
    print(result == ex['expected']) # True

我使用rows = len(data)[-1],因此它可以有任意大小。

外部while检查地点row是否为空,并开始在while之前寻找非空元素prev的内部row。之后,它将非空元素从prev移动到row,并将{0}放入prev。它会在下一个row位置重新开始。

它看起来比其他解决方案更复杂。

答案 1 :(得分:1)

这是一种合理有效的方法。我们将网格的最后一列抓取到名为lastcol的列表中,然后使用键函数对lastcol进行排序,该函数测试每个项目是否不等于零。这会将所有零移动到lastcol的开头,而不会影响其他元素的顺序。然后我们将lastcol复制回网格。

我已经稍微修改了您的测试数据,以便我们可以看到代码处理差距和正面&amp;负值正确。

grid = [[0, 0, -1], [1, 0, 2], [2, 0, 0], [3, 0, -3], [4, 0, 0]]
print(grid)

lastcol = [u[-1] for u in grid]
lastcol.sort(key=(0).__ne__)
for row, u in zip(grid, lastcol):
    row[-1] = u
print(grid)

<强>输出

[[0, 0, -1], [1, 0, 2], [2, 0, 0], [3, 0, -3], [4, 0, 0]]
[[0, 0, 0], [1, 0, 0], [2, 0, -1], [3, 0, 2], [4, 0, -3]]