鉴于此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]]
非常感谢!!
答案 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]]