Python 基于Codingame的MIME类型提取
我正试图解决一个关于编码我的难题: 目标是提取一些字符串的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
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