foxiangzun 发表于 2020-7-1 10:19:42

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:}

wingl 发表于 2020-7-1 10:19:43

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)

不确定是否有遗漏。。

Twilight6 发表于 2020-7-1 14:04:53



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

代码很丑....将就吧嘿嘿....{: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']))


foxiangzun 发表于 2020-7-2 09:11:12

Twilight6 发表于 2020-7-1 14:04
你的测试可以过,但是我觉得我的代码过不了系统隐藏测试....试试看吧~~嘿嘿

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

感谢支持,但是普通执行都没通过{:9_221:}

以下是效果图

Twilight6 发表于 2020-7-2 09:14:30

foxiangzun 发表于 2020-7-2 09:11
感谢支持,但是普通执行都没通过

以下是效果图

嗷嗷 好吧 我在改改看嘿嘿

Twilight6 发表于 2020-7-2 09:16:43

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']))

foxiangzun 发表于 2020-7-2 09:33:53

Twilight6 发表于 2020-7-2 09:16
这样行嘛???

咳咳。。{:9_229:}

Twilight6 发表于 2020-7-2 09:35:29

foxiangzun 发表于 2020-7-2 09:33
咳咳。。

{:10_257:}

哈哈哈哈 我在看看

Twilight6 发表于 2020-7-2 09:44:33

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']))


foxiangzun 发表于 2020-7-2 10:03:25

Twilight6 发表于 2020-7-2 09:44
再来....辛苦你测试啦~~~谢谢!

{:9_219:}

Twilight6 发表于 2020-7-2 10:04:22

foxiangzun 发表于 2020-7-2 10:03


我去 ....这测试好骚呀...!

foxiangzun 发表于 2020-7-2 10:13:21

Twilight6 发表于 2020-7-2 10:04
我去 ....这测试好骚呀...!

系统总能刷出一堆意想不到的玩意儿出来。。我这脑袋已经快烧糊了。。

Twilight6 发表于 2020-7-2 10:13:39

foxiangzun 发表于 2020-7-2 10:03


这个结果我看不出规律了....你能帮我解读解读嘛 嘿嘿

Twilight6 发表于 2020-7-2 10:14:43

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

哈哈哈哈 是的,我做Leetcode 时候没有一次过过{:10_245:}

不过把题目做处理通过测试的感觉很爽!!!

foxiangzun 发表于 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.   这些都不属于拥有扩展名,这里包含“.”在内,都属于文件名,所以这些没有扩展名的,都排在前面

foxiangzun 发表于 2020-7-2 11:47:30

本帖最后由 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

foxiangzun 发表于 2020-7-2 11:52:13

wingl 发表于 2020-7-1 16:37
不确定是否有遗漏。。

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

Twilight6 发表于 2020-7-2 12:17:31

foxiangzun 发表于 2020-7-2 11:47
@Twilight6

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

厉害!!!!

yifenyu 发表于 2020-7-2 13:03:46



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))


试试我的

wingl 发表于 2020-7-2 14:16:54

foxiangzun 发表于 2020-7-2 11:52
感谢支持,但是报错了。。

因为我原代码是没返回列表的,我懒直接函数print,复杂的我没测试过(待会找找你和上面人的记录看看),这个简单的我还是测过的。{:5_102:}
页: [1] 2
查看完整版本: checkio上的python问题求解