Python中的平面生成器

2024-09-27 22:19:04 发布

您现在位置:Python中文网/ 问答频道 /正文

有没有可能在python中进行平坦的延迟生成?例如,我在下面的代码中尝试传递手术室步行试图只返回那些结果

def os_walk_transcript(self, walk_results):
    """Takes the results of os.walk on the data directory and returns a list of absolute paths"""
    file_check = lambda walk: len(walk[2]) > 0
    srt_prelim = lambda walk: ".srt.sjson" in " ".join(walk[2])
    relevant_results = (entry for entry in walk_results if file_check(entry) and srt_prelim(entry))
    return (self.os_path_tuple_srts(result) for result in relevant_results)

def os_path_tuple_srts(self, os_walk_tuple):
    srt_check = lambda file_name: file_name[-10:] == ".srt.sjson"
    directory, subfolders, file_paths = os_walk_tuple
    return [os.path.join(directory, file_path) for file_path in file_paths if srt_check(file_path)]

很重要的是os_walk_transcript的结果被惰性地评估,但是我希望能够以一种扁平的方式来评估它,而不是它当前的嵌套列表评估。在

例如:当前,当我从结果生成器请求结果时,我得到了一个完整的列表["1.srt.sjson", "2.srt.sjson", "3.srt.sjson"],然后如果我再次调用它,我会得到:["4.srt.sjson"]我正在一个项目中工作,其中的数据足够大且不一致,以至于这种行为会导致不一致的性能,有时这会导致事情变得缓慢比我想的还要多。有没有什么方法可以强制lazy求值变得更懒,一次只加载一个对象?在


Tags: pathlambdainselfoscheckresultsdirectory
2条回答

你不能做个这样的函数吗?在

def lazyarray(index):
    return str(index) + ".srt.sjson"

你甚至可以这么做

^{pr2}$

完全懒惰,而且实现非常简单。如果你想少一点懒惰(缓存计算),你可以这样做。在

cache = []
def lazyarray(index):
    if len(cache) <= index:
        cache += ["" for x in xrange(index - len(cache))]
    if cache[index] == "":
        cache[index] = str(index) + ".srt.sjson"
    return cache[index]

我没有测试过这些代码,所以它可能需要调整,我也不处理文件,但这不是你要问的吗?在

不管你在代码里,而不是说

lazyarray[5]

就说吧

lazyarray(5)

它将具有与数组相同的效果。在

编辑: 您甚至可以重写__getitem__方法,如here所示,并根据我在上面发布的代码创建一个自定义生成器类。在

您可以使用itertools链。不可编辑(). 文档是here.

基本上,你可以这样使用它:

import itertools

myList = [[1,2,3],[4,5],[6],[7,8,9]]

itr = itertools.chain.from_iterator(myList)

itr现在是一个生成器对象,每次调用它时都返回下一个元素。(在本例中,它将与xrange(10)完全相同)

相关问题 更多 >

    热门问题