2012-02-25 44 views
2

我想功能导出该输入/输出模式:展开一个元组半成品重复成对

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

的想法是,先前的元组的第二元件被重复的第一个元素下一个元组。除了使用迭代范式之外,我无法得到任何其他方法。

对于它的价值,我试图回答this question,我还必须在下个月的聚会上演示函数式Python。所以请帮我一箭双雕,谢谢!

回答

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)) 
+0

嘿!你已经回答了另一个人的问题!嘘! ';)' – Droogans 2012-02-25 20:36:27

+0

@Droogans,哈哈,对不起 - 我没有意识到它是同一个。 – senderle 2012-02-25 20:37:38

+0

@Droogans,但看着你的评论,我想我明白你的意思,而且我认为它比我的答案更有趣(这比教育效率更高)。无论如何你都应该发布它。 – senderle 2012-02-25 20:42:53

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)