1.以下题目转载自“光荣之路”,作者:三毛和荷西,原文链接:https://mp.weixin.qq.com/s/rOtUcZhZxDhP64NJdqvK9w
对以下数组进行排序:
arr = (
[4,5,9,4,1],
[11,14,9,6,20],
[21,44,90,16,21],
[16,34,99,600,230],
[121,18,89,60,33]
)
期望结果:
数组arr[0][0]为最大值,arr[4][4]为第二大,arr[0][1]为第三大,arr[4][3]为第四大,依此类推arr[2][2]为最小值。
arr = (
[600, 121, 90, 60, 34],
[21,20, 16, 14, 9],
[6,4, 1, 4, 5],
[9,11, 16, 18, 21],
[33,44, 89, 99, 230]
)
由题目可知:1. 排序后的二维列表的前半部分是从大到小排序,后半部分是从小到到排序2. 第一个元素比最后一个元素大,第二个元素比倒数第二个元素大。。。依次,直到中间的那个元素分别是两边元素中最小的。
算法:1. 使用列表推导式,将二维列表拆分为一维列表2. 将步骤1中得到的一维列表进行降序排列3. 声明两个变量,分别用于存储一维列表偶数位和奇数位的元素4. 基于位置遍历一位列表5. 判断当前位置是否是偶数位
a)如果是,则将当前位置元素依次加入的arr1的尾部,即元素还是保持一维列表从大到小的顺序
b)如果不是,则将当前位置元素依次加入arr2的头部,即元素按从小到大的顺序在arr1中排列
因为每一次取的元素都会比上一次元素小,使用insert方法插入0位置,
即每次将小的元素插入列表头部,以此实现从小到大的效果
6. 将arr1和arr2合并成一个新的列表,这个列表的前半部分从大到小排序,后半部分从小到小到大排序7. 声明一个变量result,存放结果列表;temp存放临时列表8. 基于坐标遍历遍历第6步生成的列表9. 判断当前坐标是否不为0,且能被5整除,如果是,则将temp加入到result中,并将temp重置为空列表
a)当前坐标不为0,且不为5--->即说明temp中已经有5个元素
b)将temp作为一个元素加入result,以此实现二维列表的效果
c)将temp重置为空列表,用于重新取后面五位数
10. 不管步骤9的条件是否满足,都将当前位置元素加入temp中11. 重复步骤9和10,直到arr中所有的元素都被遍历完12. for循环遍历结束后,因为temp中还有值,此时i的值是len(arr)-1=19,不满足被5整除的条件
即最后五个元素没有加入到result列表,通过else语句将temp加入到result
(for循环对应的else语句,只要for循环没有被break中断,循环结束后,else语句就会被执行)
arr = ( [4,5,9,4,1], [11,14,9,6,20], [21,44,90,16,21], [16,34,99,600,230], [121,18,89,60,33])
a_list = [j for i in arr for j in i] # 将二维列表转化成一维列表 a_list.sort(reverse=True) # 按从大到小降序排列 arr1 = [] # 存储偶数位元素 arr2 = [] # 存储奇数位元素 for i in range(len(a_list)): # 基于位置遍历一维列表 if i % 2 == 0: # 判断是否是偶数位 arr1.append(a_list[i]) # 如果是偶数位,就将偶数位元素顺序加入arr1 else: arr2.insert(0, a_list[i]) # 如果是奇数位,就将奇数位元素倒序加入arr2 arr = arr1+arr2 # 将arr1和arr2合并成一个新列表 result = [] temp = [] for i in range(len(arr)): # 基于左边遍历列表 if (i != 0 and i % 5 == 0): # 当前左边是否为能被5整除,且不为0的值 result.append(temp) # 如果是,将temp列表加入result列表 temp = [] # 同时清空temp列表 temp.append(arr[i]) # 将当前坐标元素加入temp else: result.append(temp) # 将最后一个temp(即最后五个元素)加入result print(tuple(result)) # 将result转为元组并打印