鱼C论坛

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

[已解决]checkio上的python问题求解

[复制链接]
发表于 2020-7-1 10:19:42 | 显示全部楼层 |阅读模式
10鱼币
各位鱼油大家好,前两天在checkio(https://py.checkio.org/)上看到一道题,结果转了好几个圈,还是没能转出来,反而把自己给绕晕了。。

原题如下:

Sort by Extension

You are given a list of files. You need to sort this list by the file extension. The files with the same extension should be sorted by name.

Some possible cases:

Filename cannot be an empty string;
Files without the extension should go before the files with one;
Filename ".config" has an empty extension and a name ".config";
Filename "config." has an empty extension and a name "config.";
Filename "table.imp.xls" has an extension "xls" and a name "table.imp";
Filename ".imp.xls" has an extension "xls" and a name ".imp".
Input: A list of filenames.

Output: A list of filenames.

Example:

  1. sort_by_ext(['1.cad', '1.bat', '1.aa']) == ['1.aa', '1.bat', '1.cad']
  2. sort_by_ext(['1.cad', '1.bat', '1.aa', '2.bat']) == ['1.aa', '1.bat', '2.bat', '1.cad']
  3. sort_by_ext(['1.cad', '1.bat', '1.aa', '.bat']) == ['.bat', '1.aa', '1.bat', '1.cad']
  4. sort_by_ext(['1.cad', '1.bat', '.aa', '.bat']) == ['.aa', '.bat', '1.bat', '1.cad']
  5. sort_by_ext(['1.cad', '1.', '1.aa']) == ['1.', '1.aa', '1.cad']
  6. sort_by_ext(['1.cad', '1.bat', '1.aa', '1.aa.doc']) == ['1.aa', '1.bat', '1.cad', '1.aa.doc']
复制代码



翻译:

按扩展名排序

您将获得一份文件列表。您需要按文件扩展名对列表进行排序。具有相同扩展名的文件应该按名称排序。

一些可能的情况:

文件名不能是空字符串;
没有扩展名的文件应该放在有扩展名的文件之前;
文件名 “.config” 有一个空的扩展名和名称 “.config”;
文件名 “config.” 扩展名为空,名称为 “config”;
文件名 “table.imp.xls” 的扩展名为 “xls”,名称为 “table.imp”。
文件名 " imp.xls " 有一个扩展名 " xls " 和一个名称 “imp”。
输入:文件名列表。

输出:文件名列表。

示例:

  1. sort_by_ext(['1.cad', '1.bat', '1.aa']) == ['1.aa', '1.bat', '1.cad']
  2. sort_by_ext(['1.cad', '1.bat', '1.aa', '2.bat']) == ['1.aa', '1.bat', '2.bat', '1.cad']
  3. sort_by_ext(['1.cad', '1.bat', '1.aa', '.bat']) == ['.bat', '1.aa', '1.bat', '1.cad']
  4. sort_by_ext(['1.cad', '1.bat', '.aa', '.bat']) == ['.aa', '.bat', '1.bat', '1.cad']
  5. sort_by_ext(['1.cad', '1.', '1.aa']) == ['1.', '1.aa', '1.cad']
  6. sort_by_ext(['1.cad', '1.bat', '1.aa', '1.aa.doc']) == ['1.aa', '1.bat', '1.cad', '1.aa.doc']
复制代码



自己的代码改了不下 20 遍,写了两天。。愣是没做出来。。只好厚着脸皮在这里向各位请教了
最佳答案
2020-7-1 10:19:43
  1. import re
  2. def checklist(filelist):   #判断是否有空字符
  3.     for file in filelist:
  4.         if file == '':
  5.             return False
  6.     return True

  7. def sort_by_ext(filelist):
  8.     if not checklist(filelist):
  9.         raise ValueError('传入的文件名列表不能存在空字符!')
  10.    
  11.     pattern = re.compile(r'(.*)\.(.*)')
  12.     filename = []
  13.     extension = []
  14.     for file in filelist:
  15.         r = pattern.search(file)
  16.         if r.group(1) != '':
  17.             filename.append(r.group(1))
  18.             extension.append(r.group(2))
  19.         else:
  20.             filename.append('.' + r.group(2))
  21.             extension.append('')
  22.             
  23.     length = len(filename)   
  24.     file_dict={}
  25.     for i in range(length):
  26.         if extension[i] not in file_dict:
  27.             file_dict[extension[i]] = [filename[i]]
  28.         else:
  29.             file_dict[extension[i]].append(filename[i])
  30.     sort_ext = sorted(file_dict.keys())
  31.     new_file_dict = {}
  32.     for each in sort_ext:
  33.         file_dict[each].sort()
  34.         new_file_dict[each] = file_dict[each]
  35.         
  36.     result = []
  37.     for i in new_file_dict.keys():
  38.         for j in new_file_dict[i]:
  39.             result.append(j + '.' + i)
  40.    
  41.     print(result)
复制代码


不确定是否有遗漏。。

最佳答案

查看完整内容

不确定是否有遗漏。。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2020-7-1 10:19:43 | 显示全部楼层    本楼为最佳答案   
  1. import re
  2. def checklist(filelist):   #判断是否有空字符
  3.     for file in filelist:
  4.         if file == '':
  5.             return False
  6.     return True

  7. def sort_by_ext(filelist):
  8.     if not checklist(filelist):
  9.         raise ValueError('传入的文件名列表不能存在空字符!')
  10.    
  11.     pattern = re.compile(r'(.*)\.(.*)')
  12.     filename = []
  13.     extension = []
  14.     for file in filelist:
  15.         r = pattern.search(file)
  16.         if r.group(1) != '':
  17.             filename.append(r.group(1))
  18.             extension.append(r.group(2))
  19.         else:
  20.             filename.append('.' + r.group(2))
  21.             extension.append('')
  22.             
  23.     length = len(filename)   
  24.     file_dict={}
  25.     for i in range(length):
  26.         if extension[i] not in file_dict:
  27.             file_dict[extension[i]] = [filename[i]]
  28.         else:
  29.             file_dict[extension[i]].append(filename[i])
  30.     sort_ext = sorted(file_dict.keys())
  31.     new_file_dict = {}
  32.     for each in sort_ext:
  33.         file_dict[each].sort()
  34.         new_file_dict[each] = file_dict[each]
  35.         
  36.     result = []
  37.     for i in new_file_dict.keys():
  38.         for j in new_file_dict[i]:
  39.             result.append(j + '.' + i)
  40.    
  41.     print(result)
复制代码


不确定是否有遗漏。。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2020-7-1 14:04:53 | 显示全部楼层


你的测试可以过,但是我觉得我的代码过不了系统隐藏测试....试试看吧~~嘿嘿

代码很丑....将就吧嘿嘿....

  1. def sort_by_ext(file_list):
  2.     not_contain_suffix = []
  3.     temp = []
  4.     for i in range(len(file_list)):
  5.         suffix = [_[::-1] for _ in file_list[i][::-1].split('.')][::-1]
  6.         if suffix[0]:
  7.             temp.append(file_list[i])
  8.         else:
  9.             not_contain_suffix.append(file_list[i])
  10.     not_contain_suffix.sort()
  11.     _ = {}           # 创建字典记录 '.' 的数量 ; '.' 数相同的放同一列表
  12.     for i in temp:   # '.' 数相同的放同一字典键中的的列表中去
  13.         if i.count('.') in _:
  14.             _[i.count('.')].append(i)
  15.         else:
  16.             _[i.count('.')] = [i]
  17.     temp = [*_.values()]  # 将所有列表取出
  18.     temp.sort(key= lambda x:x[0].count('.'))  # 根据 . 的数量排序
  19.     contain_suffix = []   
  20.     for i in temp:     # 循环 temp 开始对每个列表进行排序
  21.         i.sort(key=lambda x:x[1:])  
  22.         contain_suffix += i   # 拼接上列表
  23.     return not_contain_suffix+contain_suffix


  24. print(sort_by_ext(['1.cad', '1.bat', '1.aa']))
  25. print(sort_by_ext(['1.cad', '1.bat', '1.aa', '2.bat']))
  26. print(sort_by_ext(['1.cad', '1.bat', '1.aa', '.bat']))
  27. print(sort_by_ext(['1.cad', '1.bat', '.aa', '.bat']))
  28. print(sort_by_ext(['1.cad', '1.', '1.aa']))
  29. print(sort_by_ext(['1.cad', '1.bat', '1.aa', '1.aa.doc']))


复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2020-7-2 09:11:12 | 显示全部楼层
Twilight6 发表于 2020-7-1 14:04
你的测试可以过,但是我觉得我的代码过不了系统隐藏测试....试试看吧~~嘿嘿

代码很丑....将就吧嘿嘿 ...

感谢支持,但是普通执行都没通过

以下是效果图

这是把测试的列表放进去

这是把测试的列表放进去

这是执行结果

这是执行结果

这是要求的结果

这是要求的结果
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2020-7-2 09:14:30 | 显示全部楼层
foxiangzun 发表于 2020-7-2 09:11
感谢支持,但是普通执行都没通过

以下是效果图

嗷嗷 好吧 我在改改看嘿嘿
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2020-7-2 09:16:43 | 显示全部楼层
foxiangzun 发表于 2020-7-2 09:11
感谢支持,但是普通执行都没通过

以下是效果图



这样行嘛???


  1. def sort_by_ext(file_list):
  2.     not_contain_suffix = []
  3.     temp = []
  4.     for i in range(len(file_list)):
  5.         suffix = [_[::-1] for _ in file_list[i][::-1].split('.')][::-1]

  6.         if len(suffix)>2:
  7.             temp.append(file_list[i])
  8.         else:
  9.             not_contain_suffix.append(file_list[i])
  10.     not_contain_suffix.sort()
  11.     _ = {}           # 创建字典记录 '.' 的数量 ; '.' 数相同的放同一列表
  12.     for i in temp:   # '.' 数相同的放同一字典键中的的列表中去
  13.         if i.count('.') in _:
  14.             _[i.count('.')].append(i)
  15.         else:
  16.             _[i.count('.')] = [i]
  17.     temp = [*_.values()]  # 将所有列表取出
  18.     temp.sort(key= lambda x:x[0].count('.'))  # 根据 . 的数量排序
  19.     contain_suffix = []
  20.     for i in temp:     # 循环 temp 开始对每个列表进行排序
  21.         i.sort(key=lambda x:x[1:])
  22.         contain_suffix += i   # 拼接上列表
  23.     return not_contain_suffix+contain_suffix


  24. print(sort_by_ext(['1.cad', '1.bat', '1.aa']))
  25. print(sort_by_ext(['1.cad', '1.bat', '1.aa', '2.bat']))
  26. print(sort_by_ext(['1.cad', '1.bat', '1.aa', '.bat']))
  27. print(sort_by_ext(['1.cad', '1.bat', '.aa', '.bat']))
  28. print(sort_by_ext(['1.cad', '1.', '1.aa']))
  29. print(sort_by_ext(['1.cad', '1.bat', '1.aa', '1.aa.doc']))
  30. print(sort_by_ext(['1.cad', '1.bat', '1.aa', '.aa.doc']))
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2020-7-2 09:33:53 | 显示全部楼层

咳咳。。

1.png
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2020-7-2 09:35:29 | 显示全部楼层




哈哈哈哈 我在看看
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2020-7-2 09:44:33 | 显示全部楼层



再来....辛苦你测试啦~~~谢谢!


  1. def sort_by_ext(file_list):
  2.     not_contain_suffix = []
  3.     temp = []
  4.     for i in range(len(file_list)):
  5.         suffix = [_[::-1] for _ in file_list[i][::-1].split('.')][::-1]
  6.         if len(suffix)>=2 and (suffix[0] or len(suffix) > 2):
  7.             temp.append(file_list[i])
  8.         else:
  9.             not_contain_suffix.append(file_list[i])
  10.     not_contain_suffix.sort()
  11.     _ = {}           # 创建字典记录 '.' 的数量 ; '.' 数相同的放同一列表
  12.     for i in temp:   # '.' 数相同的放同一字典键中的的列表中去
  13.         if i.count('.') in _:
  14.             _[i.count('.')].append(i)
  15.         else:
  16.             _[i.count('.')] = [i]
  17.     temp = [*_.values()]  # 将所有列表取出
  18.     temp.sort(key= lambda x:x[0].count('.'))  # 根据 . 的数量排序
  19.     contain_suffix = []
  20.     for i in temp:     # 循环 temp 开始对每个列表进行排序
  21.         i.sort(key=lambda x:x[1:])
  22.         contain_suffix += i   # 拼接上列表
  23.     return not_contain_suffix+contain_suffix


  24. print(sort_by_ext(['1.cad', '1.bat', '1.aa']))
  25. print(sort_by_ext(['1.cad', '1.bat', '1.aa', '2.bat']))
  26. print(sort_by_ext(['1.cad', '1.bat', '1.aa', '.bat']))
  27. print(sort_by_ext(['1.cad', '1.bat', '.aa', '.bat']))
  28. print(sort_by_ext(['1.cad', '1.', '1.aa']))
  29. print(sort_by_ext(['1.cad', '1.bat', '1.aa', '1.aa.doc']))
  30. print(sort_by_ext(['1.cad', '1.bat', '1.aa', '.aa.doc']))


复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2020-7-2 10:03:25 | 显示全部楼层
Twilight6 发表于 2020-7-2 09:44
再来....辛苦你测试啦~~~谢谢!



1.png
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2020-7-2 10:04:22 | 显示全部楼层

我去 ....这测试好骚呀...!
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2020-7-2 10:13:21 | 显示全部楼层
Twilight6 发表于 2020-7-2 10:04
我去 ....这测试好骚呀...!

系统总能刷出一堆意想不到的玩意儿出来。。我这脑袋已经快烧糊了。。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2020-7-2 10:13:39 | 显示全部楼层

这个结果我看不出规律了....你能帮我解读解读嘛 嘿嘿
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2020-7-2 10:14:43 | 显示全部楼层
foxiangzun 发表于 2020-7-2 10:13
系统总能刷出一堆意想不到的玩意儿出来。。我这脑袋已经快烧糊了。。


哈哈哈哈 是的,我做Leetcode 时候没有一次过过

不过把题目做处理通过测试的感觉很爽!!!
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2020-7-2 10:43:07 | 显示全部楼层
Twilight6 发表于 2020-7-2 10:13
这个结果我看不出规律了....你能帮我解读解读嘛 嘿嘿

首先,这里的排序是优先按扩展名排序,扩展名相同,再按文件名排序的,例如:

aa.imp  ———— 这里的 “aa” 就是文件名,“imp” 就是扩展名

aa.imp, bb.aa ———— 排序后的结果应该是:bb.aa, aa.imp (扩展名字母的 ASCII 较大的排后,此时不考虑文件名)

aa.imp, 1a.imp ———— 排序后的结果应该是:1a.imp, aa.imp (扩展名相同,按照文件名排序)

但是以上是常规情况,还有一些特殊情况,例如:

.a   .a.    a.   这些都不属于拥有扩展名,这里包含“.”在内,都属于文件名,所以这些没有扩展名的,都排在前面
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2020-7-2 11:47:30 | 显示全部楼层
本帖最后由 foxiangzun 于 2020-7-2 11:53 编辑

@Twilight6

我自己整出来了。。虽然代码奇丑无比。。


  1. # coding=utf-8

  2. from typing import List

  3. def sort_by_ext(files: List[str]) -> List[str]:
  4.     list1, list2 = [], []
  5.     for i in files :
  6.         if i.index('.') in (0, -1) and i.count('.') < 2 :
  7.             list1.append(i)
  8.         elif i[0] == i[-1] == '.' and i.count('.') == 2 :
  9.             list1.append(i)
  10.         elif i[-1] == '.' :
  11.             list1.append(i)
  12.         else :
  13.             list2.append(i)
  14.     if len(list1) > 1 :
  15.         list1.sort()
  16.     if len(list2) > 1 :
  17.         for i in range(len(list2)) :
  18.             for j in range(len(list2) - i - 1) :
  19.                 temp1, temp2 = list2[j].split('.'), list2[j + 1].split('.')
  20.                 fileNum = len(list2[j]) if len(list2[j]) < len(list2[j + 1]) else len(list2[j + 1])
  21.                 nameNum = len(temp1[-1]) if len(temp1[-1]) < len(temp2[-1]) else len(temp2[-1])
  22.                 if temp1[-1] == temp2[-1] :
  23.                     for k in range(fileNum) :
  24.                         if list2[j][k] > list2[j + 1][k] :
  25.                             list2[j], list2[j + 1] = list2[j + 1], list2[j]
  26.                         elif list2[j][k] < list2[j + 1][k] :
  27.                             break
  28.                 else :
  29.                     for k in range(nameNum) :
  30.                         if temp1[-1][k] > temp2[-1][k] :
  31.                             list2[j], list2[j + 1] = list2[j + 1], list2[j]
  32.                             break
  33.                         elif temp1[-1][k] < temp2[-1][k] :
  34.                             break
  35.     return list1 + list2
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2020-7-2 11:52:13 | 显示全部楼层
wingl 发表于 2020-7-1 16:37
不确定是否有遗漏。。

感谢支持,但是报错了。。

1.png
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2020-7-2 12:17:31 | 显示全部楼层
foxiangzun 发表于 2020-7-2 11:47
@Twilight6

我自己整出来了。。虽然代码奇丑无比。。

厉害!!!!
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2020-7-2 13:03:46 | 显示全部楼层


  1. def get_res(L, index_List):
  2.     return [L[i] for i in index_List]


  3. def sort_by_ext0(L):
  4.     L = sorted(L)
  5.     len_L = len(L)
  6.     hou_zhui = {y: x.split(".")[-1] for x, y in zip(L, range(len_L))}
  7.     hou_zhui_s = set(hou_zhui.values())
  8.     hou_zhui_d = {x: [] for x in hou_zhui_s}
  9.     for k, v in hou_zhui.items():
  10.         hou_zhui_d[v].append(k)
  11.     other_qz_i = []
  12.     for item in sorted(hou_zhui_d.keys()):
  13.         other_qz = {L[x].split(".")[0]: x for x in hou_zhui_d[item]}
  14.         for x in sorted(other_qz.keys()):
  15.             other_qz_i.append(other_qz[x])

  16.     return get_res(L, other_qz_i)


  17. def sort_by_ext(L):
  18.     yin_cang = [x for x in L if not x.split(".")[0]]
  19.     other = [x for x in L if x.split(".")[0]]
  20.     return sort_by_ext0(yin_cang) + sort_by_ext0(other)


  21. L = ['1.cad', '1.bat', '1.aa', '2.bat',".aa", ".c.d", "name.","green.bat", "345.bin","best.test.ext", '1.aa.doc']
  22. print(sort_by_ext(L))
复制代码


试试我的
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2020-7-2 14:16:54 | 显示全部楼层
foxiangzun 发表于 2020-7-2 11:52
感谢支持,但是报错了。。

因为我原代码是没返回列表的,我懒直接函数print,复杂的我没测试过(待会找找你和上面人的记录看看),这个简单的我还是测过的。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-6-22 23:17

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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