2
我想功能导出该输入/输出模式:展开一个元组半成品重复成对
>>> foo((2, 3, 4, 5))
[(2, 3), (3, 4), (4, 5)]
的想法是,先前的元组的第二元件被重复的第一个元素下一个元组。除了使用迭代范式之外,我无法得到任何其他方法。
对于它的价值,我试图回答this question,我还必须在下个月的聚会上演示函数式Python。所以请帮我一箭双雕,谢谢!
我想功能导出该输入/输出模式:展开一个元组半成品重复成对
>>> foo((2, 3, 4, 5))
[(2, 3), (3, 4), (4, 5)]
的想法是,先前的元组的第二元件被重复的第一个元素下一个元组。除了使用迭代范式之外,我无法得到任何其他方法。
对于它的价值,我试图回答this question,我还必须在下个月的聚会上演示函数式Python。所以请帮我一箭双雕,谢谢!
>>> 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))
怎么样递归解决方案(和功能!):
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)
嘿!你已经回答了另一个人的问题!嘘! ';)' – Droogans 2012-02-25 20:36:27
@Droogans,哈哈,对不起 - 我没有意识到它是同一个。 – senderle 2012-02-25 20:37:38
@Droogans,但看着你的评论,我想我明白你的意思,而且我认为它比我的答案更有趣(这比教育效率更高)。无论如何你都应该发布它。 – senderle 2012-02-25 20:42:53