鱼C论坛

 找回密码
 立即注册
查看: 3571|回复: 33

[技术交流] Python:每日一题 199

[复制链接]
发表于 2018-8-15 14:27:43 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 冬雪雪冬 于 2018-8-19 18:53 编辑

发表于 昨天 12:50 | 只看该作者
我们的玩法做了一下改变:

1. 楼主不再提供答案。
2. 请大家先独立思考,再参考其他鱼油的解答,这样才有助于自己编程水平的提高。开始阶段是看不到其他人的回帖的,等答题完成,开始评分时再取消限制。
3. 鼓励大家积极答题,奖励的期限为出题后24小时内。
4. 根据答案的质量给予1~3鱼币的奖励。

题目:
一个由整数组成的二维列表,这里以4X4为例,
  1. [[-15, -82, 88, -10], [-29, -88, -43, 23], [-2, 27, 26, 8], [64, 39, 65, 93]]
复制代码

打印成一个二维的方阵是:
  1. -15        -82        88        -10       
  2. -29        -88        -43        23       
  3. -2        27        26        8       
  4. 64        39        65        93
复制代码


现在要求一个特殊的排序方式使得列表成为这样:
  1. [[-88, 8, 23, 93], [-82, -2, 26, 88], [-43, -10, 27, 65], [-29, -15, 39, 64]]
复制代码

即数字由小到大的排列是,从方阵的第一列的由上到下,第二列的由下到上,以此类推。
1.jpg

本帖被以下淘专辑推荐:

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2018-8-15 14:37:44 | 显示全部楼层
本帖最后由 凌九霄 于 2018-8-15 17:39 编辑
  1. lst = [ [ -15, -82, 88, -10 ], [ -29, -88, -43, 23 ], [ -2, 27, 26, 8 ], [ 64, 39, 65, 93 ] ]

  2. lsta = sorted([ x for y in lst for x in y ])
  3. lstb = [ lsta[ i * 4:i * 4 + 4 ][ ::-1 ] if i % 2 else lsta[ i * 4: i * 4 + 4 ] for i in range(4) ]
  4. lstc = [ [ lstb[ i ][ j ] for i in range(0, 4) ] for j in range(0, 4) ]

  5. for i in lstc:
  6.     print(*i)
复制代码

评分

参与人数 2荣誉 -1 鱼币 -1 收起 理由
qwertyuiop1822 -4 -4 不要投机取巧,直接打印答案
冬雪雪冬 + 3 + 3

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2018-8-15 15:30:49 | 显示全部楼层
list1=[[-88, 8, 23, 93], [-82, -2, 26, 88], [-43, -10, 27, 65], [-29, -15, 39, 64]]
count=0
for each_list in list1:
    each_list.sort()
    for j in each_list:
        print(j,end=' ')
        count+=1
        if count==4:
            print('\n')
            count=0

评分

参与人数 2荣誉 -1 鱼币 -1 收起 理由
qwertyuiop1822 -4 -4 投机取巧,打印答案
冬雪雪冬 + 3 + 3

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-8-15 15:36:16 | 显示全部楼层
  1. a = [[-15, -82, 88, -10], [-29, -88, -43, 23], [-2, 27, 26, 8], [64, 39, 65, 93]]
  2. b = []
  3. for i in a:
  4.     b += i   
  5. b.sort()
  6. c = []
  7. for i in range(4):
  8.     if i % 2 == 0:
  9.         c.append(b[i*4: i*4+4])
  10.     else:
  11.         c.append(b[i*4: i*4+4][::-1])
  12. d = list(zip(*c))
  13. print(d)
复制代码

评分

参与人数 1荣誉 +3 鱼币 +3 收起 理由
冬雪雪冬 + 3 + 3

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-8-15 16:27:58 | 显示全部楼层
  1. # 返回方阵元素从小到大排列的一个列表
  2. #[-88, -82, -43, -29, -15, -10, -2, 8, 23, 26, 27, 39, 64, 65, 88, 93]
  3. def sort_matrix(matrix_list):
  4.     length = len(matrix_list)
  5.     sort_list = []
  6.     for each in matrix_list:
  7.         for each_num in each:
  8.             sort_list.append(each_num)
  9.     sort_list.sort()
  10.     return sort_list

  11. #返回图中所示蜿蜒曲折的排列的方阵
  12. #[[-88, -82, -43, -29], [8, -2, -10, -15], [23, 26, 27, 39], [93, 88, 65, 64]]
  13. def zigzag(sort_list):
  14.     length = int(len(sort_list)**0.5)
  15.     temp_matrix = []
  16.     for i in range(length):
  17.         temp = []
  18.         for j in range(length):
  19.             if i%2:
  20.                 temp.append(sort_list[(i+1)*length-j-1])
  21.             else:
  22.                 temp.append(sort_list[i*length+j])
  23.         temp_matrix.append(temp)
  24.     return temp_matrix

  25. def fun199(matrix_list):
  26.     length = len(matrix_list)
  27.     zz_matrix = zigzag(sort_matrix(matrix_list))
  28.     result = []
  29.     for i in range(length):
  30.         temp = []
  31.         for j in range(length):
  32.             temp.append(zz_matrix[j][i])
  33.         result.append(temp)
  34.     return result
  35.    
  36. if __name__ == '__main__':
  37.     test_list = [[-15, -82, 88, -10], [-29, -88, -43, 23], [-2, 27, 26, 8], [64, 39, 65, 93]]
  38.     print(fun199(test_list))
复制代码

评分

参与人数 1荣誉 +3 鱼币 +3 收起 理由
冬雪雪冬 + 3 + 3

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-8-15 16:41:54 | 显示全部楼层
  1. import numpy
  2. list1 = [[-15, -82, 88, -10], [-29, -88, -43, 23], [-2, 27, 26, 8], [64, 39, 65, 93]]
  3. def sort_list(list1):
  4.     list2 = []
  5.     list3 = []
  6.     list4 = []
  7.     list5 = []
  8.     list6 = []
  9.     len_list1 = len(list1)
  10.     for x in range(len_list1):
  11.         for y in range(len_list1):
  12.             list3.append(list1[x][y])
  13.     list3 = sorted(list3)
  14.     for x in range(0,len(list3),len_list1):
  15.         list2.append(list3[x:x+len_list1])
  16.     for x in range(len_list1):
  17.         if x % 2 == 0:
  18.             list4.append(list2[x])
  19.         else:
  20.             list4.append(sorted(list2[x],reverse=True))
  21.     for x in range(len_list1):
  22.         for y in range(len_list1):
  23.             list5.append(list4[y][x])
  24.     for x in range(0,len(list5),len_list1):
  25.         list6.append(list5[x:x+len_list1])
  26.     return numpy.array(list6).reshape(len(list6),4)
  27. print(sort_list(list1))
复制代码

评分

参与人数 1荣誉 +3 鱼币 +3 收起 理由
冬雪雪冬 + 3 + 3

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-8-15 16:59:54 | 显示全部楼层
  1. def fun199(dlist):
  2.     one_dim = sorted([j for i in dlist for j in i])
  3.     c = len(dlist[0])
  4.     two_dim = []
  5.     for t in range(0, len(one_dim), c):
  6.         if (t // c) % 2:
  7.             tr = one_dim[t:t + c]
  8.             tr.reverse()
  9.             two_dim.append(tr)
  10.         else:
  11.             two_dim.append(one_dim[t:t + c])

  12.     return list(map(list, list(transpose(two_dim))))


  13. def transpose(matrix):
  14.     return zip(*matrix)


  15. dlist = [[-15, -82, 88, -10], [-29, -88, -43, 23], [-2, 27, 26, 8], [64, 39, 65, 93]]
  16. print(fun199(dlist))
复制代码


结果:
[[-88, 8, 23, 93], [-82, -2, 26, 88], [-43, -10, 27, 65], [-29, -15, 39, 64]]

评分

参与人数 1荣誉 +3 鱼币 +3 收起 理由
冬雪雪冬 + 3 + 3

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-8-15 17:01:27 | 显示全部楼层
本帖最后由 塔利班 于 2018-8-15 19:02 编辑
  1. def fun199(x):
  2.     n=len(x)
  3.     m=len(x[0])
  4.     t=[]
  5.     for each in x:
  6.         t+=each
  7.     t.sort()
  8.     for j in range(m):
  9.         for i in range(n):
  10.             if not j%2:
  11.                 x[i][j]=t[n*j+i]
  12.             else:
  13.                 x[i][j]=t[n*j+n-1-i]
  14.     return x
复制代码


完全不会numpy,感觉用那个会不会简单点

评分

参与人数 1荣誉 +3 鱼币 +3 收起 理由
冬雪雪冬 + 3 + 3

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-8-15 17:35:35 | 显示全部楼层
本帖最后由 天圆突破 于 2018-8-16 08:41 编辑

只针对这道题(4x4,不加验证参数)
  1. from functools import reduce
  2. list(zip(*list(map(lambda x:list(reversed(x)) if list(zip(*[iter(sorted((reduce(lambda x,y:x+y, lst))))]*4)).index(x)%2 else x ,list(zip(*[iter(sorted((reduce(lambda x,y:x+y, lst))))]*4))))))
复制代码

扩展到任意n*n列表(加验证参数):
  1. from functools import reduce
  2. def func199(lst):
  3.     if not reduce(lambda x, y: x and y, map(lambda x: isinstance(x, list) and len(x) == len(lst), lst)):        #查错
  4.         print("错误的格式")
  5.         return
  6.     lst = list(zip(*[iter(sorted((reduce(lambda x,y:x+y, lst))))]*len(lst)))    #排序并分组
  7.     lst = list(map(lambda x:list(reversed(x)) if lst.index(x)%2 else x ,lst))    #把奇数列逆排序后转置
  8.     return list(zip(*lst))
复制代码

  1. if __name__ == '__main__':
  2.     lst = [[-15, -82, 88, -10], [-29, -88, -43, 23], [-2, 27, 26, 8], [64, 39, 65, 93]]
  3.     print(func199(lst))
复制代码

评分

参与人数 1荣誉 +4 鱼币 +4 收起 理由
冬雪雪冬 + 4 + 4

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-8-15 18:22:22 | 显示全部楼层
  1. import numpy as np
  2. def fun199(l):
  3.     x = np.array(l)
  4.     x = np.sort(l, axis=None)
  5.     x.shape = 4,4
  6.     x.tolist()
  7.     for i in range(4):
  8.         for each in range(4):
  9.             if i == 0 or i == 2:
  10.                 l[each][i]= x[i][each]
  11.             else:
  12.                 l[each][i]= x[i][::-1][each]
  13.     return l
  14. fun199([[-15, -82, 88, -10], [-29, -88, -43, 23], [-2, 27, 26, 8], [64, 39, 65, 93]])
复制代码

评分

参与人数 1荣誉 +3 鱼币 +3 收起 理由
冬雪雪冬 + 3 + 3

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-8-15 18:59:17 | 显示全部楼层
  1. def fun199(list1):
  2.     list2=[i for li in list1 for i in li]
  3.     list2.sort()
  4.     list3=[[list2.pop(0) for a1 in list1[0]] for a2 in list1]
  5.     for a in [x for x in range(len(list3)) if x%2]:
  6.         list3[a].reverse()
  7.     list4=[[list3[b1][b2] for b1 in range(len(list3))] for b2 in range(len(list3[0]))]
  8.     return list4
复制代码

评分

参与人数 1荣誉 +3 鱼币 +3 收起 理由
冬雪雪冬 + 3 + 3

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-8-15 19:12:35 | 显示全部楼层

可以处理4*4,5*5正方型矩阵,
  1. import numpy as np
  2. def fun199(l):
  3.     w = len(l)
  4.     x = np.array(l)
  5.     x = np.sort(l, axis=None)
  6.     x.shape = w,w
  7.     x.tolist()
  8.     for i in range(w):
  9.         for each in range(w):
  10.             if i + 2 % 2 == 0:
  11.                 l[each][i]= x[i][each]
  12.             else:
  13.                 l[each][i]= x[i][::-1][each]
  14.     return l
  15. fun199([[-15, -82, 88, -10], [-29, -88, -43, 23], [-2, 27, 26, 8], [64, 39, 65, 93]])
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-8-15 19:29:56 | 显示全部楼层
  1. def newList(list0):
  2.     list1 = []
  3.     list2 = []
  4.     list3 = []
  5.     list4 = []
  6.     list5 = []
  7.     list6 = []
  8.     for i in list0:
  9.         for j in i:
  10.             list1.append(j)
  11.     list1.sort()
  12.     for i in range(len(list1)):
  13.         if i % 8 == 0 or i % 8 == 7:
  14.             list2.append(list1[i])
  15.         elif i % 8 == 1 or i % 8 == 6:
  16.             list3.append(list1[i])
  17.         elif i % 8 == 2 or i % 8 == 5:
  18.             list4.append(list1[i])
  19.         else:
  20.             list5.append(list1[i])
  21.     for i in range(2, 6):
  22.         list6.append(eval("list%d"%i))
  23.     return list6

  24. list0 = [[-15, -82, 88, -10], [-29, -88, -43, 23], [-2, 27, 26, 8], [64, 39, 65, 93]]
  25. print(newList(list0))
复制代码

评分

参与人数 1荣誉 +3 鱼币 +3 收起 理由
冬雪雪冬 + 3 + 3

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-8-16 08:58:07 | 显示全部楼层
  1. def Newlist(list_a):
  2.     list_long = []
  3.    
  4.     for i in range(len(list_a)):
  5.         list_long = list_long + list_a[i]
  6.         
  7.     list_long.sort()
  8.     num = 0
  9.    
  10.     for n in range(len(list_a[0])):                  #循环赋值
  11.         for m in range(len(list_a)):
  12.             if n%2 == 0:
  13.                 list_a[m][n] = list_long[num]
  14.                 num += 1
  15.             else:
  16.                 list_a[len(list_a)-m-1][n] = list_long[num]
  17.                 num += 1

  18.     for m in range(len(list_a)):                     #循环打印
  19.         for n in range(len(list_a[0])):
  20.             print(str(list_a[m][n]).ljust(7),end = '')
  21.         print('')

  22. list_a = [[-88, 8, 23, 93,44], [-82, -2, 26, 88,45], [-43, -10, 27, 65,12], [-29, -15, 39, 64,68],[3,43,72,-22,-28]]
  23. Newlist(list_a)


  24. """
  25. 输出结果:
  26. -88    3      8      64     65     
  27. -82    -2     12     45     68     
  28. -43    -10    23     44     72     
  29. -29    -15    26     43     88     
  30. -28    -22    27     39     93

  31. """
复制代码

评分

参与人数 1荣誉 +3 鱼币 +3 收起 理由
冬雪雪冬 + 3 + 3

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-8-16 09:41:48 | 显示全部楼层
  1. #coding:utf-8


  2. def sort(a):
  3.     m = []
  4.     for i in a:
  5.         m += i
  6.     n = sorted(m)
  7.     cut(n)

  8. def cut(n):
  9.     b = []
  10.     b.append(n[0:4])
  11.     b.append(list(reversed(n[4:8])))
  12.     b.append(n[8:12])
  13.     b.append(list(reversed(n[12:16])))

  14.     # print(b)
  15.     result(b)

  16. def result(b):
  17.     c = [[i[j] for i in b] for j in range(len(b[0]))]
  18.     # print(c)
  19.     for k in c:
  20.         print('')
  21.         for h in k:
  22.             print('%s   \t'%h,end='')

  23. if __name__ == '__main__':
  24.     a = [[-15, -82, 88, -10], [-29, -88, -43, 23], [-2, 27, 26, 8], [64, 39, 65, 93]]
  25.     sort(a)
复制代码

评分

参与人数 1荣誉 +3 鱼币 +3 收起 理由
冬雪雪冬 + 3 + 3

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-8-16 09:44:58 | 显示全部楼层
本帖最后由 maogo 于 2018-8-16 09:47 编辑
  1. A = [[-15, -82, 88, -10], [-29, -88, -43, 23], [-2, 27, 26, 8], [64, 39, 65, 93]]
  2. #将A中所有元素放入一个列表中,并排序
  3. listA = []
  4. for col in A:
  5.     for num in col:
  6.         listA.append(num)
  7. listA.sort()
  8. print(listA)
  9. #每次取出listA中最小元素依次放入B的四个列表中
  10. B0 = []
  11. B1 = []
  12. B2 = []
  13. B3 = []
  14. i = j = 0
  15. for num in listA:
  16.     keyi = i % 4
  17.     keyj = j % 2
  18.     if keyj == 0:   #如果为j奇数,从前向后添加
  19.         if keyi == 0:
  20.             B0.append(num)
  21.         elif keyi == 1:
  22.             B1.append(num)
  23.         elif keyi == 2:
  24.             B2.append(num)
  25.         else:
  26.             B3.append(num)
  27.             j+= 1
  28.         i+= 1
  29.     else:   #如果为j偶数,从后向前添加
  30.         if keyi == 0:
  31.             B3.append(num)
  32.         elif keyi == 1:
  33.             B2.append(num)
  34.         elif keyi == 2:
  35.             B1.append(num)
  36.         else:
  37.             B0.append(num)
  38.             j+= 1
  39.         i+= 1
  40. B = [B0,B1,B2,B3]
  41. print(B)
复制代码

评分

参与人数 1荣誉 +3 鱼币 +3 收起 理由
冬雪雪冬 + 3 + 3

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-8-16 10:35:06 From FishC Mobile | 显示全部楼层
list1=[[-15, -82, 88, -10], [-29, -88, -43, 23], [-2, 27, 26, 8], [64, 39, 65, 93]]
count=0
list2=[]
for i in range(4):
        for j in range(4):
                list2.append(list1[i][j])
list3=sorted(list2)
#chongxinpaixu,anzhao shu chu yao qiu
list4=[]
for n in range(4):
        list4.append([])
for m in range(16):
        if m in range(4):
                list4[m].append(list3[m])
        elif m in range(4,8):
                list4[7-m].append(list3[m])
        elif m in range(8,12):
                list4[m-8].append(list3[m])
        elif m in range(12,16):
                list4[15-m].append(list3[m])
#dayin
for k in range(4):
        for l in range(4):
                print(list4[k][l],end=' ')
                count += 1
                if(count%4==0):
                        print(end='\n')

评分

参与人数 1荣誉 +3 鱼币 +3 收起 理由
冬雪雪冬 + 3 + 3

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-8-16 11:15:02 | 显示全部楼层
a=[[-15, -82, 88, -10], [-29, -88, -43, 23], [-2, 27, 26, 8], [64, 39, 65, 93]]
imax,jmax,n=len(a),len(a[0]),0
b=sorted([x[k] for x in a for k in range(jmax)])

for j in range(jmax):
        (i1,i2,step)=(0,imax,1) if j%2==0 else (imax-1,-1,-1)
        for i in range(i1,i2,step):               
                a[i][j]=b[n]
                n+=1
print(a)

评分

参与人数 1荣誉 +3 鱼币 +3 收起 理由
冬雪雪冬 + 3 + 3

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-8-16 11:53:17 | 显示全部楼层
  1. def fun199(x):
  2.     list_a = [[] for i in range(len(x))]
  3.     list_b = []
  4.     for i in x:
  5.         for j in i:
  6.             list_b.append(j)
  7.     list_b = sorted(list_b)
  8.     for i in range(len(x)):
  9.         if i%2 == 0:
  10.             for j in range(len(x)):
  11.                 list_a[j].append(list_b[0])
  12.                 list_b = list_b[1:]
  13.         else:
  14.             for j in range(len(x))[::-1]:
  15.                 list_a[j].append(list_b[0])
  16.                 list_b = list_b[1:]
  17.     return list_a
复制代码

  1. >>> fun199([[-15, -82, 88, -10], [-29, -88, -43, 23], [-2, 27, 26, 8], [64, 39, 65, 93]])
  2. [[-88, 8, 23, 93], [-82, -2, 26, 88], [-43, -10, 27, 65], [-29, -15, 39, 64]]
复制代码

评分

参与人数 1荣誉 +3 鱼币 +3 收起 理由
冬雪雪冬 + 3 + 3

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-8-16 13:12:01 | 显示全部楼层
  1. def a199():
  2.         list1=[[-15, -82, 88, -10], [-29, -88, -43, 23], [-2, 27, 26, 8], [64, 39, 65, 93]]
  3.         list2=[]
  4.         for i in list1:
  5.                 for j in i:
  6.                         list2.append(j)
  7.         list2.sort()
  8.         list3=[]
  9.         n=4
  10.         list3=[list2[i:i+n] for i in range(0,len(list2),n)]
  11.         list3[1].sort(reverse=True)
  12.         list3[3].sort(reverse=True)
  13.         for i in range(len(list3)):
  14.                 print(list3[0][i],end='\t')
  15.                 print(list3[1][i],end='\t')
  16.                 print(list3[2][i],end='\t')
  17.                 print(list3[3][i])
  18. a199()
复制代码

评分

参与人数 1荣誉 +3 鱼币 +3 收起 理由
冬雪雪冬 + 3 + 3

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-4-20 15:47

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表