首页 > 解决方案 > 如何创建可索引的 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__.

我知道我可以对列表进行子分类,但我真的希望有一种更清洁的方式来做到这一点。

标签: pythonpython-3.x

解决方案


为什么不创建一个访问器类?

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。过度使用继承也不是最好的风格。


推荐阅读