如何嵌套生成器

时间:2019-02-06 20:12:34

标签: python generator

我正在研究生成器,以使我的某些代码更高效。当前想知道如何/应该处理每个创建列表的嵌套循环。嵌套循环为for循环的每个步骤重新生成值列表。这些值是3列馈送数据的向量归一化。从该列表中获取最大值并将其添加到该函数返回的列表中。 似乎可以通过使用生成器来提高效率。但是我不确定如何处理嵌套的for循环,因为该函数将在第一个yield处停止。

当前代码;

def define_max_values(data, indexes):

    max_values = []

    for iter in range(len(indexes)):
        data_index_window = data[index[iter] - 5:index[iter] + 50]
        for i in range(len(data_index_window)):
            sub_list = []   
            sub_list.append(np.linalg.norm(data_index_window.iloc[i, 0:3].values))

        max_values.append(max(sub_list))
    return max_values

我认为可以使用1个生成器将其转换为

def define_max_values(data, indexes):
     for iter in range(len(indexes)):
            data_index_window = data[index[iter] - 5:index[iter] + 50]
            for i in range(len(data_index_window)):
                sub_list = []
                sub_list.append(np.linalg.norm(data_index_window.iloc[i, 0:3].values))

            yield(max(sub_list)

这似乎已经更具可读性/效率,但是想知道是否可以/如何替换内部list.append和另一个产量。

1 个答案:

答案 0 :(得分:1)

max不需要序列,它也可以与生成器一起使用,例如:

def define_max_values(data, indexes):
    for iter in range(len(indexes)):
        data_index_window = data[index[iter] - 5:index[iter] + 50]
        yield max(np.linalg.norm(
                          data_index_window.iloc[i, 0:3].values) \
                  for i in range(len(data_index_window)))