Преобразуйте элементы из итерируемых с помощью последовательности унарных функций - PullRequest
0 голосов
/ 05 февраля 2010

Мне часто приходится применять последовательность унарных функций к последовательности одинаковой длины. Моя первая мысль - перейти с map(), однако для этого требуется только одна функция, которая будет применена ко всем элементам в последовательности.

В следующем коде, например, я хочу применить str.upper() к первому элементу и int ко второму элементу в каждом a. «transform» - это заполнитель для эффекта, которого я хочу.

COLS = tuple([transform((str.upper, int), a.split(",")) for a in "pid,5 user,8 program,28 dev,10 sent,9 received,15".split()])

Есть ли какая-нибудь стандартная библиотека или другая хорошая реализация, которая может выполнить такое преобразование аккуратно?

Ответы [ 3 ]

3 голосов
/ 05 февраля 2010

А как же ...:

def transform(functions, arguments):
  return [f(a) for f, a in zip(functions, arguments)]
1 голос
/ 05 февраля 2010

Я сейчас использую это:

def transform(unaries, iterable):
    return map(lambda a, b: a(b), unaries, iterable)
1 голос
/ 05 февраля 2010
>>> s="pid,5 user,8 program,28 dev,10 sent,9 received,15".split()
>>> [ ( m.upper(),int(n)) for m, n in [i.split(",") for i in s ] ]
[('PID', 5), ('USER', 8), ('PROGRAM', 28), ('DEV', 10), ('SENT', 9), ('RECEIVED', 15)]
...