python - 如何创建可索引的 map() 或修饰的 list()?
问题描述
我有一长串文件路径,例如:
images = ['path/to/1.png', 'path/to/2.png']
我知道我可以将此列表包装在映射迭代器中,它提供对通过函数映射的列表中的项目的顺序访问,例如:
image_map = map(cv2.imread, images)
然后我可以在遍历列表时延迟加载这些图像文件:
next(image_map)
=> pixels
但我想随机访问通过我的 map 函数映射的原始列表:
image_map[400]
=> pixels
我不想将其转换为 a list
,因为这会将我的所有图像加载到内存中,并且它们不适合内存:
# Bad:
list(image_map)[400]
考虑这个问题的另一种方式可能是在list.__getitem__
.
我知道我可以对列表进行子分类,但我真的希望有一种更清洁的方式来做到这一点。
解决方案
为什么不创建一个访问器类?
class ImageList(object):
def __init__(self, images):
self.images = images
def get_image(self, image_num):
return cv2.imread(self.images[image_num])
您当然也可以缓冲读取的图像。
您还可以提供一种__getitem__
具有类似列表访问权限的方法:
def __getitem__(self, key):
return cv2.imread(self.images[key])
用法:
images = ['path/to/1.png', 'path/to/2.png']
image_list = ImageList(images)
image = image_list.get_image(400) # the same as
image = image_list[400] # this
顺便说一句:当然你可以子类list
化,但在 Python 社区中更显式的更受青睐。这里更清楚的是有一个单独的类而不是子类list
。过度使用继承也不是最好的风格。
推荐阅读
- c# - 通过两个stackalloc'ed Span
和 by-ref 结构作为参数 - unity3d - 为什么我的网格组合器脚本使子对象不可见并更改它们的位置?
- javascript - 在 ReactJS 中导入实例的问题。有人可以解释一下为什么这有效吗?
- objective-c - Domain=AVFoundationErrorDomain Code=-11814 仅在 iPhone6 上发生
- c# - 不支持 Protobuf-NET IExtensible 继承的解决方法
- javascript - QML 内存泄漏发送 XMLHttpRequest
- javascript - 如何在 gatsbyjs 中使用动态参数创建路由
- c# - 如何从 LambdaExpressions 创建的 MethodBuilders 创建可相互调用的 MethodInfos?
- android - 为什么使用 Android Asset Studio 生成的通知图标的图像是全白的?
- c++ - 试图在 C++ 中输出数组的元素