Python вычисляет интервалы, используя сложный лэмбда - PullRequest
1 голос
/ 08 марта 2012
def tointervals(tlist):
      count=0
      for i in tlist:
        if count == 0:
          count = count + 1
          yield 0
        else:
          count = count + 1
          yield i - tlist[count -2]

Я проверяю это так:

In [272]: list(tointervals([1,2,3,4,10]))
Out[272]: [0, 1, 1, 1, 6]

Отлично, это именно то, что я искал

Но я хочу сделать это более функционально (яя в основном использую Scala)

Я совершенно запутался в этом, в основном из-за незнания Python.Самое близкое, что я получил, прежде чем сдаться в предельной неразберихе, это:

In [292]: reduce(lambda x,y: (x[0] + [y - x[0][x[1]] ],x[1]+1), [1,2,3,4,10], ([0],0))
Out[292]: ([0, 1, 1, 2, 2, 8], 5)

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

Ответы [ 4 ]

4 голосов
/ 08 марта 2012

Понимание списка будет более питонным:

>>> l = [1, 2, 3, 4, 10]
>>> [y-x for x, y in zip(l, l[1:])]
[1, 1, 1, 6]
2 голосов
/ 08 марта 2012

Я бы предпочел пойти с одним из нескольких питонических решений из этой темы, но если вы хотите посмотреть решение на основе reduce просто для удовольствия, это будет что-то вроде этого:* Пожалуйста, не пытайтесь сделать это в реальном коде, потому что ваши коллеги проклянут вас.

2 голосов
/ 08 марта 2012

Это путь Pythonic, если я правильно понимаю ваше намерение:

def tointervals(l):
    return [0] + [l[i] - l[i-1] for i in xrange(1, len(l))]

или

def tointervals(l):
    return (y-x for x,y in itertools.izip([l[0]] + l[:-1], l))

Функциональное программирование не считается самоцелью в сообществе Pythonи языковая поддержка для него ограничена - «практичность превосходит чистоту» .

0 голосов
/ 08 марта 2012

Опираясь на ответ Ларсмана, вы также можете создать генератор, как в коде процедуры:

def tointervals(xs):
    return itertools.chain((0,), (xs[i] - xs[i-1] for i in range(1, len(xs))))

Примечание: используйте xrange с python2.

...