2009-03-09 2 views
4

Как запустить операцию над коллекцией в Python и собрать результаты?Как запустить операцию над коллекцией в Python и собрать результаты?

Так что, если у меня есть список из 100 чисел, и я хочу, чтобы запустить функцию, как это для каждого из них:

Operation (originalElement, anotherVar) # returns new number. 

и собрать результат, как так:

результат = другой список ...

Как это сделать? Может быть, использовать лямбда?

ответ

12

List comprehensions. В Python они выглядят что-то вроде:

a = [f(x) for x in bar] 

где Р (х) есть некоторая функция и бар последовательность.

Вы можете определить F (X) в виде частично прикладной функции с конструкцией, как:

def foo(x): 
    return lambda f: f*x 

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

>>> def foo (x): 
...  return lambda f: f*x 
... 
>>> a=[1,2,3] 
>>> fn_foo = foo(5) 
>>> [fn_foo (y) for y in a] 
[5, 10, 15] 

Хотя я не представляю себе, используя этот вид конструкции в любых, но довольно эзотерических случаях. Python не является истинным функциональным языком, поэтому у него меньше возможностей делать умные трюки с более высокими функциями порядка, чем (скажем) Haskell. Вы можете найти приложения для этого типа конструкции, но это не действительно , что pythonic. Вы можете достичь простое преобразование с чем-то вроде:

>>> y=5 
>>> a=[1,2,3] 
>>> [x*y for x in a] 
[5, 10, 15] 
+1

foo (x, другойVar)? –

+0

Спасибо, это довольно хороший синтаксис. –

+0

Mykola: В зависимости от того, что вы хотите, я бы сказал y = 4; a = [f (x, y) для x в баре] или a = [f (x, y) для x, y в zip (bar, baz)]. Также см. Izip. –

1

Другой (несколько Остаточного) способ сделать это:

Защита Кевин (v): возвращения v * v

Vals = диапазон (0100)

карта (Кевин, Vals)

+0

IIRC это сохраняется как устаревшая функция, но реализован как обертка вокруг списков. – ConcernedOfTunbridgeWells

Смежные вопросы