将元组扩展为半重复对

时间:2012-02-25 20:30:26

标签: python functional-programming

我想功能派生此输入/输出模式:

>>> foo( (2, 3, 4, 5) )
[(2, 3), (3, 4), (4, 5)]

这个想法是前一个元组的第二个元素被重复作为下一个元组的第一个元素。除了使用迭代范式之外,我无法得到它。

为了它的价值,我正在尝试回答this question,我还必须在下个月的聚会上演示功能性Python。所以请帮我一石二鸟,谢谢!

2 个答案:

答案 0 :(得分:4)

>>> f = (2, 3, 4, 5)
>>> zip(f[:-1], f[1:])
[(2, 3), (3, 4), (4, 5)]

或者,来自docs

>>> from itertools import tee, izip
>>> def pairwise(iterable):
...     "s -> (s0,s1), (s1,s2), (s2, s3), ..."
...     a, b = tee(iterable)
...     next(b, None)
...     return izip(a, b)
... 
>>> tuple(pairwise(f))
((2, 3), (3, 4), (4, 5))

答案 1 :(得分:0)

递归(和功能!)解决方案如何:

def foo(t):
    if len(t) < 2:
        return []
    return [(t[0], t[1])] + foo(t[1:])

这是解决它的另一种方法,因为它不会像上面的解决方案那样创建t的临时切片,所以效率更高一些:

def foo(t):
    limit = len(t) - 2
    def bar(i):
        if i > limit:
            return []
        return [(t[i], t[i+1])] + bar(i+1)
    return bar(0)