Python 基于Codingame的MIME类型提取

Python 基于Codingame的MIME类型提取,python,Python,我正试图解决一个关于编码我的难题: 目标是提取一些字符串的MIME类型,如下所示 输入: 输出: text/html UNKNOWN image/png UNKNOWN 到目前为止,我的代码运行顺利,但在一个较长的列表中,我得到一个错误,我的进程已超时。 有人能提示我吗 我的代码: import sys import math # Auto-generated code below aims at helping you parse # the standard input accordin

我正试图解决一个关于编码我的难题:

目标是提取一些字符串的MIME类型,如下所示 输入:

输出:

text/html
UNKNOWN
image/png
UNKNOWN
到目前为止,我的代码运行顺利,但在一个较长的列表中,我得到一个错误,我的进程已超时。 有人能提示我吗

我的代码:

import sys
import math

# Auto-generated code below aims at helping you parse
# the standard input according to the problem statement.

n = int(input())  # Number of elements which make up the association table.
q = int(input())  # Number Q of file names to be analyzed.
mime = dict(input().split() for x in range(n))
fname = [input() for x in range(q)]

# Write an action using print
# To debug: print("Debug messages...", file=sys.stderr)

for b in fname:
    if '.' not in b:
        print('UNKNOWN')
        continue
    else:    
        for idx, char in enumerate(reversed(b)):
            if char == '.':
                ext = b[len(b)-idx:]
                for k, v in mime.items():
                    if ext.lower() == k.lower():
                        print(v)
                        break
                else:
                    print('UNKNOWN')
                break

我不确定这是否是代码超时的原因,但在字典的键和值上进行case-instive匹配总是相对缓慢的。使用字典的主要原因是它有
O(1)
查找时间。如果你不利用这一点,你最好有一个元组列表

幸运的是,修复dict并不难,这样您就可以使用索引而不是迭代来手动检查每个键。以下是对代码的相关更改:

# set up the dict with lowercase extensions
mime = {ext.lower(): tp for ext, tp in (input().split() for _ in range(n))}

fnames = [input() for x in range(q)] # changed the variable name here, plural for a list

for filename in fnames: # better variable name than `b`
    if '.' not in filename:
        print("UNKNOWN") # no need for continue
    else:
        _, extension = filename.rsplit('.', 1) # no need to write your own split loop
        print(mime.get(extension.lower(), "UNKNOWN")) # Do an O(1) lookup in the dictionary

除了修改字典创建和查找代码外,我还简化了您用来拆分扩展名的代码,尽管我的方法仍然是
O(N)
,就像您的方法一样(其中
N
是文件名的长度)。

谢谢!对于不区分大小写的查找,必须做一个小小的更改,fnames=[input().lower()for。
# set up the dict with lowercase extensions
mime = {ext.lower(): tp for ext, tp in (input().split() for _ in range(n))}

fnames = [input() for x in range(q)] # changed the variable name here, plural for a list

for filename in fnames: # better variable name than `b`
    if '.' not in filename:
        print("UNKNOWN") # no need for continue
    else:
        _, extension = filename.rsplit('.', 1) # no need to write your own split loop
        print(mime.get(extension.lower(), "UNKNOWN")) # Do an O(1) lookup in the dictionary