checkio上的python问题求解
各位鱼油大家好,前两天在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:
sort_by_ext(['1.cad', '1.bat', '1.aa']) == ['1.aa', '1.bat', '1.cad']
sort_by_ext(['1.cad', '1.bat', '1.aa', '2.bat']) == ['1.aa', '1.bat', '2.bat', '1.cad']
sort_by_ext(['1.cad', '1.bat', '1.aa', '.bat']) == ['.bat', '1.aa', '1.bat', '1.cad']
sort_by_ext(['1.cad', '1.bat', '.aa', '.bat']) == ['.aa', '.bat', '1.bat', '1.cad']
sort_by_ext(['1.cad', '1.', '1.aa']) == ['1.', '1.aa', '1.cad']
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”。
输入:文件名列表。
输出:文件名列表。
示例:
sort_by_ext(['1.cad', '1.bat', '1.aa']) == ['1.aa', '1.bat', '1.cad']
sort_by_ext(['1.cad', '1.bat', '1.aa', '2.bat']) == ['1.aa', '1.bat', '2.bat', '1.cad']
sort_by_ext(['1.cad', '1.bat', '1.aa', '.bat']) == ['.bat', '1.aa', '1.bat', '1.cad']
sort_by_ext(['1.cad', '1.bat', '.aa', '.bat']) == ['.aa', '.bat', '1.bat', '1.cad']
sort_by_ext(['1.cad', '1.', '1.aa']) == ['1.', '1.aa', '1.cad']
sort_by_ext(['1.cad', '1.bat', '1.aa', '1.aa.doc']) == ['1.aa', '1.bat', '1.cad', '1.aa.doc']
自己的代码改了不下 20 遍,写了两天。。愣是没做出来。。只好厚着脸皮在这里向各位请教了{:5_100:} {:5_100:} {:5_100:} import re
def checklist(filelist): #判断是否有空字符
for file in filelist:
if file == '':
return False
return True
def sort_by_ext(filelist):
if not checklist(filelist):
raise ValueError('传入的文件名列表不能存在空字符!')
pattern = re.compile(r'(.*)\.(.*)')
filename = []
extension = []
for file in filelist:
r = pattern.search(file)
if r.group(1) != '':
filename.append(r.group(1))
extension.append(r.group(2))
else:
filename.append('.' + r.group(2))
extension.append('')
length = len(filename)
file_dict={}
for i in range(length):
if extension not in file_dict:
file_dict] = ]
else:
file_dict].append(filename)
sort_ext = sorted(file_dict.keys())
new_file_dict = {}
for each in sort_ext:
file_dict.sort()
new_file_dict = file_dict
result = []
for i in new_file_dict.keys():
for j in new_file_dict:
result.append(j + '.' + i)
print(result)
不确定是否有遗漏。。
你的测试可以过,但是我觉得我的代码过不了系统隐藏测试....试试看吧~~嘿嘿
代码很丑....将就吧嘿嘿....{:10_278:}
def sort_by_ext(file_list):
not_contain_suffix = []
temp = []
for i in range(len(file_list)):
suffix = for _ in file_list[::-1].split('.')][::-1]
if suffix:
temp.append(file_list)
else:
not_contain_suffix.append(file_list)
not_contain_suffix.sort()
_ = {} # 创建字典记录 '.' 的数量 ; '.' 数相同的放同一列表
for i in temp: # '.' 数相同的放同一字典键中的的列表中去
if i.count('.') in _:
_.append(i)
else:
_ =
temp = [*_.values()]# 将所有列表取出
temp.sort(key= lambda x:x.count('.'))# 根据 . 的数量排序
contain_suffix = []
for i in temp: # 循环 temp 开始对每个列表进行排序
i.sort(key=lambda x:x)
contain_suffix += i # 拼接上列表
return not_contain_suffix+contain_suffix
print(sort_by_ext(['1.cad', '1.bat', '1.aa']))
print(sort_by_ext(['1.cad', '1.bat', '1.aa', '2.bat']))
print(sort_by_ext(['1.cad', '1.bat', '1.aa', '.bat']))
print(sort_by_ext(['1.cad', '1.bat', '.aa', '.bat']))
print(sort_by_ext(['1.cad', '1.', '1.aa']))
print(sort_by_ext(['1.cad', '1.bat', '1.aa', '1.aa.doc']))
Twilight6 发表于 2020-7-1 14:04
你的测试可以过,但是我觉得我的代码过不了系统隐藏测试....试试看吧~~嘿嘿
代码很丑....将就吧嘿嘿 ...
感谢支持,但是普通执行都没通过{:9_221:}
以下是效果图 foxiangzun 发表于 2020-7-2 09:11
感谢支持,但是普通执行都没通过
以下是效果图
嗷嗷 好吧 我在改改看嘿嘿 foxiangzun 发表于 2020-7-2 09:11
感谢支持,但是普通执行都没通过
以下是效果图
这样行嘛???{:10_297:}
def sort_by_ext(file_list):
not_contain_suffix = []
temp = []
for i in range(len(file_list)):
suffix = for _ in file_list[::-1].split('.')][::-1]
if len(suffix)>2:
temp.append(file_list)
else:
not_contain_suffix.append(file_list)
not_contain_suffix.sort()
_ = {} # 创建字典记录 '.' 的数量 ; '.' 数相同的放同一列表
for i in temp: # '.' 数相同的放同一字典键中的的列表中去
if i.count('.') in _:
_.append(i)
else:
_ =
temp = [*_.values()]# 将所有列表取出
temp.sort(key= lambda x:x.count('.'))# 根据 . 的数量排序
contain_suffix = []
for i in temp: # 循环 temp 开始对每个列表进行排序
i.sort(key=lambda x:x)
contain_suffix += i # 拼接上列表
return not_contain_suffix+contain_suffix
print(sort_by_ext(['1.cad', '1.bat', '1.aa']))
print(sort_by_ext(['1.cad', '1.bat', '1.aa', '2.bat']))
print(sort_by_ext(['1.cad', '1.bat', '1.aa', '.bat']))
print(sort_by_ext(['1.cad', '1.bat', '.aa', '.bat']))
print(sort_by_ext(['1.cad', '1.', '1.aa']))
print(sort_by_ext(['1.cad', '1.bat', '1.aa', '1.aa.doc']))
print(sort_by_ext(['1.cad', '1.bat', '1.aa', '.aa.doc']))
Twilight6 发表于 2020-7-2 09:16
这样行嘛???
咳咳。。{:9_229:}
foxiangzun 发表于 2020-7-2 09:33
咳咳。。
{:10_257:}
哈哈哈哈 我在看看 foxiangzun 发表于 2020-7-2 09:33
咳咳。。
再来....辛苦你测试啦~~~谢谢!
def sort_by_ext(file_list):
not_contain_suffix = []
temp = []
for i in range(len(file_list)):
suffix = for _ in file_list[::-1].split('.')][::-1]
if len(suffix)>=2 and (suffix or len(suffix) > 2):
temp.append(file_list)
else:
not_contain_suffix.append(file_list)
not_contain_suffix.sort()
_ = {} # 创建字典记录 '.' 的数量 ; '.' 数相同的放同一列表
for i in temp: # '.' 数相同的放同一字典键中的的列表中去
if i.count('.') in _:
_.append(i)
else:
_ =
temp = [*_.values()]# 将所有列表取出
temp.sort(key= lambda x:x.count('.'))# 根据 . 的数量排序
contain_suffix = []
for i in temp: # 循环 temp 开始对每个列表进行排序
i.sort(key=lambda x:x)
contain_suffix += i # 拼接上列表
return not_contain_suffix+contain_suffix
print(sort_by_ext(['1.cad', '1.bat', '1.aa']))
print(sort_by_ext(['1.cad', '1.bat', '1.aa', '2.bat']))
print(sort_by_ext(['1.cad', '1.bat', '1.aa', '.bat']))
print(sort_by_ext(['1.cad', '1.bat', '.aa', '.bat']))
print(sort_by_ext(['1.cad', '1.', '1.aa']))
print(sort_by_ext(['1.cad', '1.bat', '1.aa', '1.aa.doc']))
print(sort_by_ext(['1.cad', '1.bat', '1.aa', '.aa.doc']))
Twilight6 发表于 2020-7-2 09:44
再来....辛苦你测试啦~~~谢谢!
{:9_219:}
foxiangzun 发表于 2020-7-2 10:03
我去 ....这测试好骚呀...! Twilight6 发表于 2020-7-2 10:04
我去 ....这测试好骚呀...!
系统总能刷出一堆意想不到的玩意儿出来。。我这脑袋已经快烧糊了。。 foxiangzun 发表于 2020-7-2 10:03
这个结果我看不出规律了....你能帮我解读解读嘛 嘿嘿 foxiangzun 发表于 2020-7-2 10:13
系统总能刷出一堆意想不到的玩意儿出来。。我这脑袋已经快烧糊了。。
哈哈哈哈 是的,我做Leetcode 时候没有一次过过{:10_245:}
不过把题目做处理通过测试的感觉很爽!!!
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. 这些都不属于拥有扩展名,这里包含“.”在内,都属于文件名,所以这些没有扩展名的,都排在前面 本帖最后由 foxiangzun 于 2020-7-2 11:53 编辑
@Twilight6
我自己整出来了。。虽然代码奇丑无比。。
# coding=utf-8
from typing import List
def sort_by_ext(files: List) -> List:
list1, list2 = [], []
for i in files :
if i.index('.') in (0, -1) and i.count('.') < 2 :
list1.append(i)
elif i == i[-1] == '.' and i.count('.') == 2 :
list1.append(i)
elif i[-1] == '.' :
list1.append(i)
else :
list2.append(i)
if len(list1) > 1 :
list1.sort()
if len(list2) > 1 :
for i in range(len(list2)) :
for j in range(len(list2) - i - 1) :
temp1, temp2 = list2.split('.'), list2.split('.')
fileNum = len(list2) if len(list2) < len(list2) else len(list2)
nameNum = len(temp1[-1]) if len(temp1[-1]) < len(temp2[-1]) else len(temp2[-1])
if temp1[-1] == temp2[-1] :
for k in range(fileNum) :
if list2 > list2 :
list2, list2 = list2, list2
elif list2 < list2 :
break
else :
for k in range(nameNum) :
if temp1[-1] > temp2[-1] :
list2, list2 = list2, list2
break
elif temp1[-1] < temp2[-1] :
break
return list1 + list2 wingl 发表于 2020-7-1 16:37
不确定是否有遗漏。。
感谢支持,但是报错了。。
foxiangzun 发表于 2020-7-2 11:47
@Twilight6
我自己整出来了。。虽然代码奇丑无比。。
厉害!!!!
def get_res(L, index_List):
return for i in index_List]
def sort_by_ext0(L):
L = sorted(L)
len_L = len(L)
hou_zhui = {y: x.split(".")[-1] for x, y in zip(L, range(len_L))}
hou_zhui_s = set(hou_zhui.values())
hou_zhui_d = {x: [] for x in hou_zhui_s}
for k, v in hou_zhui.items():
hou_zhui_d.append(k)
other_qz_i = []
for item in sorted(hou_zhui_d.keys()):
other_qz = {L.split("."): x for x in hou_zhui_d}
for x in sorted(other_qz.keys()):
other_qz_i.append(other_qz)
return get_res(L, other_qz_i)
def sort_by_ext(L):
yin_cang = ]
other = ]
return sort_by_ext0(yin_cang) + sort_by_ext0(other)
L = ['1.cad', '1.bat', '1.aa', '2.bat',".aa", ".c.d", "name.","green.bat", "345.bin","best.test.ext", '1.aa.doc']
print(sort_by_ext(L))
试试我的 foxiangzun 发表于 2020-7-2 11:52
感谢支持,但是报错了。。
因为我原代码是没返回列表的,我懒直接函数print,复杂的我没测试过(待会找找你和上面人的记录看看),这个简单的我还是测过的。{:5_102:}
页:
[1]
2