我尝试使用函数返回给定列表。
def get_ext(file_type):
text = ['txt', 'doc']
audio = ['mp3', 'wav']
video = ['mp4', 'mkv']
return ?????
get_ext('audio') #should return de list ['mp3', 'wav']
然后我被卡住了。这是一个扩展列表的简单/简短示例。 最简单的方法是什么?
答案 0 :(得分:30)
在大多数情况下,普通字典可以很好地完成工作。
>>> get_ext = {'text': ['txt', 'doc'],
... 'audio': ['mp3', 'wav'],
... 'video': ['mp4', 'mkv']
... }
>>>
>>> get_ext['video']
['mp4', 'mkv']
如果你真的想要或需要一个功能(可能有正当理由),你有几个选择。最简单的方法之一是分配到字典的get
方法。如果您没有使用幕后的字典,您甚至可以重新指定名称get_ext
。
>>> get_ext = get_ext.get
>>> get_ext('video')
['mp4', 'mkv']
如果输入未知密钥,此功能将默认返回None
:
>>> x = get_ext('binary')
>>> x is None
True
如果您想要KeyError
代替未知密钥,请分配到get_ext.__getitem__
而不是get_ext.get
。
如果你想要一个自定义的默认值,一种方法是将字典包装在一个函数中。此示例使用空列表作为默认值。
def get_ext(file_type):
types = {'text': ['txt', 'doc'],
'audio': ['mp3', 'wav'],
'video': ['mp4', 'mkv']
}
return types.get(file_type, [])
然而,@ tomri_saadon给出了有效的评论,即每次函数调用都会执行types = ...
赋值。如果这困扰你,你可以做些什么来解决这个问题。
class get_ext(object):
def __init__(self):
self.types = {'text': ['txt', 'doc'],
'audio': ['mp3', 'wav'],
'video': ['mp4', 'mkv']
}
def __call__(self, file_type):
return self.types.get(file_type, [])
get_ext = get_ext()
你可以像这里的常规函数一样使用get_ext
,因为最终callables是callables。 :)
请注意,这种方法 - 除self.types
仅创建一次之外 - 具有相当大的优势,您仍然可以轻松更改函数识别的文件类型。
>>> get_ext.types['binary'] = ['bin', 'exe']
>>> get_ext('binary')
['bin', 'exe']
答案 1 :(得分:3)
您可以轻松地将dict与元组/列表值一起使用,如下所示:
function
答案 2 :(得分:1)
使用字典:
def get_ext(file_type):
d = {'text' : ['txt', 'doc'],
'audio' : ['mp3', 'wav'],
'video' : ['mp4', 'mkv']}
try:
return d[file_type]
except KeyError:
return []
get_ext('audio') # ['mp3', 'wav']
如果该键不存在,返回空列表。 怎么这是我心中最简单的答案,为了更好的答案,请参阅@timgeb的回答。
答案 3 :(得分:1)
根据@timgeb的回答我会使用字典,但是如果你经常访问,关心速度并且不想定义一个类,你可以使用缓存。
from functools import lru_cache
def get_ext(file_type):
d = {'text': ['txt', 'doc'],
'audio': ['mp3', 'wav'],
'video': ['mp4', 'mkv']}
return d[file_type]
@lru_cache(maxsize=3, typed=False)
def get_ext_cached(file_type):
d = {'text': ['txt', 'doc'],
'audio': ['mp3', 'wav'],
'video': ['mp4', 'mkv']}
return d[file_type]
from timeit import timeit
# non cached
print(timeit(stmt='get_ext("text")', globals={'get_ext': get_ext}))
# 0.48447531609922706 on my machine
# cached
print(timeit(stmt='get_ext("text")', globals={'get_ext': get_ext_cached}))
# 0.11434909792297276
虽然对于这种特殊情况,它可能是矫枉过正的,你可以直接调用字典上的get(缓存只是构建自己的字典并完成它),你可以在将来使用它来实现任何有效的计算查找的纯函数。
d = {'text': ['txt', 'doc'],
'audio': ['mp3', 'wav'],
'video': ['mp4', 'mkv']}
# 0.05016115184298542
print(timeit(stmt="d['text']",
globals={'d':d,'c':c}))