如何创建可索引的map()或装饰列表()?

col*_*lin 6 python python-3.x

我有很长的文件路径列表,例如:

images = ['path/to/1.png', 'path/to/2.png']
Run Code Online (Sandbox Code Playgroud)

我知道我可以将此列表包装在map迭代器中,该迭代器提供对通过函数映射的列表中的项的顺序访问,如:

image_map = map(cv2.imread, images)
Run Code Online (Sandbox Code Playgroud)

然后,当我迭代列表时,我可以懒洋洋地加载这些图像文件:

next(image_map)
=> pixels
Run Code Online (Sandbox Code Playgroud)

但我希望随机访问原始列表,通过我的map函数映射:

image_map[400]
=> pixels
Run Code Online (Sandbox Code Playgroud)

我不想将它转换为a list,因为这会将我的所有图像加载到内存中,并且它们不适合内存:

# Bad:
list(image_map)[400]
Run Code Online (Sandbox Code Playgroud)

考虑这个的另一种方式可能是装饰者list.__getitem__.

我知道我可以对列表进行子类化,但我真的希望有一种更清晰的方法.

Jue*_*gen 3

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

class ImageList(object):
    def __init__(self, images):
        self.images = images

    def get_image(self, image_num):
        return cv2.imread(self.images[image_num])
Run Code Online (Sandbox Code Playgroud)

您当然也可以缓冲读取的图像。

您还可以提供一种__getitem__方法来进行类似列表的访问:

def __getitem__(self, key):
    return cv2.imread(self.images[key])
Run Code Online (Sandbox Code Playgroud)

用法:

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
Run Code Online (Sandbox Code Playgroud)

顺便说一句:当然你可以子类化list,但在 Python 社区中,更明确的方式更受青睐。这里更清楚的是有一个单独的类而不是子类list。过度使用继承也不是最好的风格。