鱼C论坛

 找回密码
 立即注册
查看: 3925|回复: 24

[技术交流] Python:每日一题82(答题领鱼币)

[复制链接]
发表于 2017-8-19 20:12:16 | 显示全部楼层 |阅读模式

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

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

x
本帖最后由 冬雪雪冬 于 2017-8-19 20:16 编辑

题目:

有一个长度不一的有10个子列表的二维列表,如下面的例子(这里为了好看,没有有列表的形式显示)
  1. A0 A1 A2 A3 A4 A5 A6 A7 A8
  2. B0 B1 B2 B3 B4 B5
  3. C0
  4. D0 D1 D2 D3 D4
  5. E0 E1 E2 E3 E4
  6. F0 F1 F2 F3 F4 F5 F6 F7 F8
  7. G0
  8. H0 H1 H2 H3 H4 H5 H6 H7 H8
  9. I0 I1 I2 I3 I4 I5
  10. J0 J1
复制代码

看上去有许多空位,编写一个函数,使列表的元素下落,成为下面的型式,形成新的列表。
  1. A0
  2. B0
  3. C0 A1
  4. D0 B1 A2 A3 A4
  5. E0 D1 B2 B3 B4
  6. F0 E1 D2 D3 D4 A5
  7. G0 F1 E2 E3 E4 B5
  8. H0 H1 F2 F3 F4 F5 A6 A7 A8
  9. I0 I1 H2 H3 H4 H5 F6 F7 F8
  10. J0 J1 I2 I3 I4 I5 H6 H7 H8
复制代码

即列表为:
  1. [['A0'], ['B0'], ['C0', 'A1'], ['D0', 'B1', 'A2', 'A3', 'A4'], ['E0', 'D1', 'B2', 'B3', 'B4'], ['F0', 'E1', 'D2', 'D3', 'D4', 'A5'], ['G0', 'F1', 'E2', 'E3', 'E4', 'B5'], ['H0', 'H1', 'F2', 'F3', 'F4', 'F5', 'A6', 'A7', 'A8'], ['I0', 'I1', 'H2', 'H3', 'H4', 'H5', 'F6', 'F7', 'F8'], ['J0', 'J1', 'I2', 'I3', 'I4', 'I5', 'H6', 'H7', 'H8']]
复制代码


写出函数:
drop(list1)
接收一个二维列表作为参数,返回一个二维列表。

为了随机生成原始列表,可以参考下面的程序:
  1. import random
  2. list1 = [[] for i in range(10)]

  3. for i in range(10):
  4.     for j in range(random.randint(1, 9)):
  5.         list1[i].append(chr(65 + i) + str(j))
复制代码


游客,如果您要查看本帖隐藏内容请回复

本帖被以下淘专辑推荐:

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

使用道具 举报

发表于 2017-8-20 07:10:19 From FishC Mobile | 显示全部楼层
坐等大佬
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-8-20 16:47:07 From FishC Mobile | 显示全部楼层
本帖最后由 jerryxjr1220 于 2017-8-20 16:49 编辑

感觉这题用numpy的转置应该会比较简单,或者自己写个转置函数,然后上下行合并就变成同行合并就简单了,只提供思路。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-8-20 18:00:42 | 显示全部楼层
jerryxjr1220 发表于 2017-8-20 16:47
感觉这题用numpy的转置应该会比较简单,或者自己写个转置函数,然后上下行合并就变成同行合并就简单了,只 ...

是的,用numpy会很方便。也可以用zip做转置。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-8-20 18:43:19 | 显示全部楼层
3个步骤:碾平;分组;获取,
假设输入都是二维数组,元素都合格
  1. import itertools as it

  2. def drop(a):
  3.     flat_a = [i for j in a for i in j]
  4.     new_a = [reversed(list(k)) for v,k in it.groupby(sorted(flat_a,key=lambda x:x[1]),lambda x:x[1])]
  5.     return [list(filter(None,i)) for i in it.zip_longest(*new_a)][::-1]
复制代码

不用工具库,自己找就比较麻烦了
不过逻辑差不多就是了
  1. def drop2(a):
  2.     result = []
  3.     nums = sorted({i[1] for j in a for i in j})
  4.     new_a = sorted([i for j in a for i in j],key=lambda x:x[1])[::-1]

  5.     while new_a:
  6.         temp=[]
  7.         for i in nums:
  8.             for j in range(len(new_a)):
  9.                 if i in new_a[j]:
  10.                     temp.append(new_a.pop(j))
  11.                     break
  12.         result.insert(0,temp)
  13.     return result
复制代码

评分

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

查看全部评分

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

使用道具 举报

发表于 2017-8-20 19:10:42 | 显示全部楼层
本帖最后由 solomonxian 于 2017-8-20 19:16 编辑

看完答案······感觉被坑了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-8-21 22:36:04 | 显示全部楼层
看答案
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-8-24 09:26:27 | 显示全部楼层
本帖最后由 chunchun2017 于 2017-8-24 09:30 编辑
  1. def drop(list1):
  2.    list2=[0 for i in range(len(list1))]
  3.    list3=[]
  4.    j = 0
  5.    for i in list1:
  6.       list2[j]=len(i)
  7.       j+=1
  8.    while(len(list2)):
  9.      a=list1.pop(list2.index(min(list2)))
  10.      list3.append(a)
  11.      list2.pop(list2.index(min(list2)))
  12.    return list3


  13. import random
  14. list1 = [[] for i in range(10)]
  15. for i in range(10):
  16.     for j in range(random.randint(1, 9)):
  17.         list1[i].append(chr(65 + i) + str(j))
  18. print(drop(list1))
复制代码

============================================
运行结果:
[['D0'], ['H0'], ['F0', 'F1', 'F2'], ['I0', 'I1', 'I2', 'I3'], ['C0', 'C1', 'C2', 'C3', 'C4'], ['G0', 'G1', 'G2', 'G3', 'G4', 'G5', 'G6'], ['A0', 'A1', 'A2', 'A3', 'A4', 'A5', 'A6', 'A7', 'A8'], ['B0', 'B1', 'B2', 'B3', 'B4', 'B5', 'B6', 'B7', 'B8'], ['E0', 'E1', 'E2', 'E3', 'E4', 'E5', 'E6', 'E7', 'E8'], ['J0', 'J1', 'J2', 'J3', 'J4', 'J5', 'J6', 'J7', 'J8']]

评分

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

查看全部评分

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

使用道具 举报

发表于 2017-8-24 22:38:40 | 显示全部楼层
学习了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-8-30 18:13:37 | 显示全部楼层
  1. def drop(ls):
  2.     ls_len = []
  3.     for each in ls:
  4.         ls_len.append(len(each))

  5.     if ls_len == sorted(ls_len):
  6.         return ls

  7.     for i in range(len(ls)-1,0,-1):
  8.         if len(ls[i]) < len(ls[i-1]):
  9.             j = len(ls[i-1])-len(ls[i])
  10.             ls[i] += ls[i-1][-j:]
  11.             ls[i-1] = ls[i-1][:-j]
  12.     return drop(ls)
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-12-5 10:31:33 | 显示全部楼层
本帖最后由 shigure_takimi 于 2017-12-6 09:41 编辑
  1. def drop(lst):
  2.     a = sorted(lst, key = lambda s:len(s))
  3.     for i in a:
  4.         print(i)





  5. a = [['A0'], ['B0'], ['C0', 'A1'], ['D0', 'B1', 'A2', 'A3', 'A4'],
  6. ['E0', 'D1', 'B2', 'B3', 'B4'], ['F0', 'E1', 'D2', 'D3', 'D4', 'A5'],
  7. ['G0', 'F1', 'E2', 'E3', 'E4', 'B5'], ['H0', 'H1', 'F2', 'F3', 'F4', 'F5', 'A6', 'A7', 'A8'],
  8. ['I0', 'I1', 'H2', 'H3', 'H4', 'H5', 'F6', 'F7', 'F8'],
  9. ['J0', 'J1', 'I2', 'I3', 'I4', 'I5', 'H6', 'H7', 'H8']]

  10. drop(a)

  11. ## 输出:
  12. ['A0']
  13. ['B0']
  14. ['C0', 'A1']
  15. ['D0', 'B1', 'A2', 'A3', 'A4']
  16. ['E0', 'D1', 'B2', 'B3', 'B4']
  17. ['F0', 'E1', 'D2', 'D3', 'D4', 'A5']
  18. ['G0', 'F1', 'E2', 'E3', 'E4', 'B5']
  19. ['H0', 'H1', 'F2', 'F3', 'F4', 'F5', 'A6', 'A7', 'A8']
  20. ['I0', 'I1', 'H2', 'H3', 'H4', 'H5', 'F6', 'F7', 'F8']
  21. ['J0', 'J1', 'I2', 'I3', 'I4', 'I5', 'H6', 'H7', 'H8']

  22. # 看错了,以为只是按元素长度排序呢,原来还要drop,改天再改吧。
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-2-1 15:44:58 | 显示全部楼层
  1. def drop(L):
  2.     for i in range(9):
  3.         if len(L[i])>len(L[i+1]):
  4.             n=len(L[i+1])
  5.             for j in range(len(L[i+1]),len(L[i])):
  6.                 L[i+1].append(L[i].pop(n))

  7. L=[['A0','A1','A2','A3','A4','A5','A6','A7','A8'],['B0','B1','B2','B3','B4','B5'],['C0'],['D0','D1','D2','D3','D4'],['E0','E1','E2','E3','E4'],['F0','F1','F2','F3','F4','F5','F6','F7','F8'],['G0'],['H1','H2','H3','H4','H5','H6','H7','H8'],['I0','I1','I2','I3','I4','I5'],['J0','J1']]
  8. index=0
  9. while index!=9:
  10.     index=0
  11.     drop(L)
  12.     for i in range(9):
  13.         if len(L[i])<=len(L[i+1]):
  14.             index += 1
  15. print(L)
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-2-4 16:19:13 | 显示全部楼层
...
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2018-2-4 22:22:25 | 显示全部楼层
有些答案看不懂
i for j in a for i in j这个怎么看,i和j又是什么
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-2-10 15:23:39 | 显示全部楼层
思路是將原列表直行的讀取
再放進新列表中而已
  1. def drop(list1):
  2.     list2 = [[] for i in range(10)]
  3.     for i in range(10):
  4.         k=9
  5.         for j in range(9, -1, -1):
  6.             try:
  7.                 list2[k].append(list1[j][i])
  8.                 k-=1
  9.             except:
  10.                 continue
  11.     return list2
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-4-20 16:39:57 | 显示全部楼层
  1. def drop(a):
  2.         for n in range(len(a)):
  3.                 for i in range(len(a)-1,0,-1):
  4.                         k=len(a[i])
  5.                         if k<len(a[i-1]):
  6.                                 a[i]=a[i]+a[i-1][k:]
  7.                                 a[i-1]=a[i-1][0:k]       
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-4-20 16:51:34 | 显示全部楼层
  1. def drop(a):
  2.         candrop=True
  3.         while candrop:
  4.                 candrop=False
  5.                 for i in range(len(a)-1,0,-1):
  6.                         k=len(a[i])
  7.                         if k<len(a[i-1]):
  8.                                 candrop=True
  9.                                 a[i]=a[i]+a[i-1][k:]
  10.                                 a[i-1]=a[i-1][0:k]       
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-8-20 10:25:56 | 显示全部楼层
本帖最后由 永恒的蓝色梦想 于 2019-8-20 11:13 编辑
  1. def drop(lis):
  2.         length=len(lis)-1;flag=1
  3.         while flag:
  4.                 flag=0
  5.                 for i in range(length):
  6.                         while len(lis[i])>len(lis[i+1]):lis[i+1].append(lis[i].pop());flag=1
  7.         return lis
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-16 10:54:25 | 显示全部楼层
  1. import random
  2. list1 = [[] for i in range(10)]
  3. for i in range(10):
  4.     for j in range(random.randint(1, 9)):
  5.         list1[i].append(chr(65 + i) + str(j))
  6.     print(list1[i])

  7. def f_82(lst1: list):
  8.     lst = [[] for _ in range(9)]
  9.     lst2 = [[] for _ in range(10)]
  10.     for i in range(0, 10):
  11.         for j in range(9, -1, -1):
  12.             try:
  13.                 if list1[j][i] == chr(65 + j) + str(i):
  14.                     lst[i].insert(0, list1[j][i])
  15.             except:
  16.                 continue

  17.     for i in reversed(range(10)):
  18.         for j in range(10):
  19.             try:
  20.                 lst2[i].append(lst[j].pop())
  21.             except:
  22.                 continue
  23.     return lst2

  24. for i in f_82(list1):
  25.     print(i)
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-7-31 17:22:01 | 显示全部楼层
康康答案
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-3-29 20:51

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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