最近在看一个项目的数据处理脚本,里面有一个需求是这样的:
我们要对一组数据进行排序,数据的格式是这样的
file_example = [[1, 1, 1, 'NULL', 1, 'context'],
[1, 2, 1, 'NULL', 2, 'context'],
[1, 1, 2, 'NULL', 1, 'context'],
[3, 2, 1, 'NULL', 1, 'context'],
[1, 1, 2, 'NULL', 1, 'context'],
[1, 3, 1, 'NULL', 1, 'context'],
[2, 2, 2, 'NULL', 1, 'context'],
[1, 2, 1, 'NULL', 2, 'context'],
[1, 3, 2, 'NULL', 1, 'context'],
[1, 2, 2, 'NULL', 1, 'context'],]
对多维数组进行按列排序,使从左到右一样的在一起,其中跳掉第4列以及最后一列。
原本的代码是写成这样的:
for i in range(len(file_example)-1, 0, -1):
for j in range(0, i, 1):
v1 = file_example[j]
v2 = file_example[j+1]
result = 0
for k in range(5):
if k == 3:
k += 1
if v1[k] == v2[k]:
result = 0
else:
try:
if v1[k] > v2[k]:
result = 1
else:
result = -1
except Exception as e:
print('Error',k)
if result == 1:
file_example[j] = v2
file_example[j+1] = v1
但是单步调试的时候发现,在判断 k==3 为真的时候执行的 k+=1,并没有真正的改变循环中的循环变量k,事实上在 +=1 后会比较一次 k=4 的值,而在返回到循环条件的判断时,k依旧是从3增加到4,这样就又会执行一次 k=4 的值得比较,数据少的时候没什么感觉,但是对于大量的数据,这样的操作会浪费很多时间。
而在while循环中,循环变量的变更实在循环体之内的,这样就给了我们在循环体内真正变更的机会,所以我把代码改了一下,变成了下面这个样子:
for i in range(len(process_file)-1, 0, -1):
for j in range(0, i, 1):
v1 = process_file[j]
v2 = process_file[j+1]
result = 0
k = 0
while k < 5:
if k == 3:
k += 1
if v1[k] == v2[k]:
result = 0
elif v1[k] > v2[k]:
result = 1
break
else:
result = -1
break
k += 1
if result == 1:
process_file[j] = v2
process_file[j+1] = v1
这样的执行的时候每一轮的比较就会少一次,也就节省了时间。
大概就是下面这样的感觉了吧
【end】……