鱼C论坛

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

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

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

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

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

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

题目:

有一个长度不一的有10个子列表的二维列表,如下面的例子(这里为了好看,没有有列表的形式显示)
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 
H0 H1 H2 H3 H4 H5 H6 H7 H8 
I0 I1 I2 I3 I4 I5 
J0 J1
看上去有许多空位,编写一个函数,使列表的元素下落,成为下面的型式,形成新的列表。
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
即列表为:
[['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)
接收一个二维列表作为参数,返回一个二维列表。

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

for i in range(10):
    for j in range(random.randint(1, 9)):
        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个步骤:碾平;分组;获取,
假设输入都是二维数组,元素都合格
import itertools as it

def drop(a):
    flat_a = [i for j in a for i in j]
    new_a = [reversed(list(k)) for v,k in it.groupby(sorted(flat_a,key=lambda x:x[1]),lambda x:x[1])]
    return [list(filter(None,i)) for i in it.zip_longest(*new_a)][::-1]
不用工具库,自己找就比较麻烦了
不过逻辑差不多就是了
def drop2(a):
    result = []
    nums = sorted({i[1] for j in a for i in j})
    new_a = sorted([i for j in a for i in j],key=lambda x:x[1])[::-1]

    while new_a:
        temp=[]
        for i in nums:
            for j in range(len(new_a)):
                if i in new_a[j]:
                    temp.append(new_a.pop(j))
                    break
        result.insert(0,temp)
    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 编辑
def drop(list1):
   list2=[0 for i in range(len(list1))]
   list3=[]
   j = 0
   for i in list1:
      list2[j]=len(i)
      j+=1
   while(len(list2)):
     a=list1.pop(list2.index(min(list2)))
     list3.append(a)
     list2.pop(list2.index(min(list2)))
   return list3


import random
list1 = [[] for i in range(10)]
for i in range(10):
    for j in range(random.randint(1, 9)):
        list1[i].append(chr(65 + i) + str(j))
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 | 显示全部楼层
def drop(ls):
    ls_len = []
    for each in ls:
        ls_len.append(len(each))

    if ls_len == sorted(ls_len):
        return ls

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

使用道具 举报

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





a = [['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(a)

## 输出:
['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,改天再改吧。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

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']]
index=0
while index!=9:
    index=0
    drop(L)
    for i in range(9):
        if len(L[i])<=len(L[i+1]):
            index += 1
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 | 显示全部楼层
思路是將原列表直行的讀取
再放進新列表中而已
def drop(list1):
    list2 = [[] for i in range(10)]
    for i in range(10):
        k=9
        for j in range(9, -1, -1):
            try:
                list2[k].append(list1[j][i])
                k-=1
            except:
                continue
    return list2
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

使用道具 举报

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

使用道具 举报

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

使用道具 举报

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

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

    for i in reversed(range(10)):
        for j in range(10):
            try:
                lst2[i].append(lst[j].pop())
            except:
                continue
    return lst2

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

使用道具 举报

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-23 01:55

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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