标准库中有类似物吗?

时间:2016-03-12 13:52:20

标签: python python-3.x

我发现我经常使用以下逻辑:

  1. 为某些value;
  2. 执行某些操作
  3. 从序列中取下一个x;
  4. value某种方式修改x;
  5. 对结果值执行相同的操作;
  6. 当序列不为空时,转到步骤2。
  7. 例如,value可能是2d点,序列可能包含2d向量。

    我为此编写了一个简单的函数,但我很好奇标准库中的类似物。对我来说这看起来很常见,但到目前为止我在itertools找不到任何内容。

    def iter_transform(value, sequence, transform):
        yield value
        for v in sequence:
            value = transform(value, v)
            yield value
    
    print(list(iter_transform(10, [+3, +4, -7, -5], lambda x, y: x + y)))
    

    输出:

    [10, 13, 17, 10, 5]
    

    更新

    将值本身添加到列表中并不总是微不足道的。当然,当我们谈论数字或坐标时,总会有一个zero,并且这种变换是一种空洞的。

    但即使是valuex的类型也可能不同:

    print(list(iter_transform('values:', [+3, +4, -7, -5], lambda x, y: x + ' ' + str(y))))
    

    输出:

    ['values:', 'values: 3', 'values: 3 4', 'values: 3 4 -7', 'values: 3 4 -7 -5']
    

1 个答案:

答案 0 :(得分:1)

通过组合内置reduce()函数和列表理解的一种解决方案:

In [1]: l = [+3, +4, -7, -5]

In [2]: [reduce(lambda x, y: x + y, l[:i+1]) for i in range(len(l), 10)]
Out[2]: [10, 13, 17, 10, 5]

但这不是很有效,因为减少功能正在做太多重复的计算。

更新:另一种使用reduce()的解决方案,更有效但不那么简单。

In [1]: l = [+3, +4, -7, -5]

In [2]: result = [l[0]]

In [3]: reduce(lambda x, y: result.append(x + y) or (x + y), l, 10)
Out[3]: 5

In [4]: result
Out[4]: [10, 13, 17, 10, 5]