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,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])
,因此它应该适用于任何大小。