Разверните кортеж в полуповторяющиеся пары - PullRequest
2 голосов
/ 26 февраля 2012

Я хотел бы функционально получить этот шаблон ввода / вывода:

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

Идея состоит в том, что второй элемент предыдущего кортежа повторяется как первый элемент следующего кортежа. Я не могу понять это иначе, чем использовать итеративные парадигмы.

Для чего оно стоит, я пытаюсь ответить на этот вопрос , и мне также нужно продемонстрировать функциональный Python на встрече в следующем месяце. Так что помогите мне убить двух зайцев, пожалуйста, и спасибо!

Ответы [ 2 ]

4 голосов
/ 26 февраля 2012
>>> f = (2, 3, 4, 5)
>>> zip(f[:-1], f[1:])
[(2, 3), (3, 4), (4, 5)]

Или из документов :

>>> 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 голосов
/ 26 февраля 2012

Как насчет рекурсивного (и функционального!) Решения:

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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...