2014-02-13 4 views
1

Я определил структуру, которая выглядит так. В основном имя значение парыЭффективно использование python map

from collections import namedtuple 
CP = namedtuple('Cell', ['attr', 'value']) 

Это вписывается в более широкий заказанного структуру, которая выглядит как этот

_structure = [CP('id', None), CP('name', None)] 

Тогда я получаю ряд результатов, которые соответствуют трем экземплярам _structure

results = [(1,'foo'),(2,"bar"),(3,"zaz")] 

Как это сделать map следующим образом:

final = [[CP('id', 1), CP('name', "foo")], 
     [CP('id', 2), CP('name', "bar")], 
     [CP('id', 3), CP('name', "zaz")],] 

ответ

1

Я хотел бы использовать список понимание:

final = [[CP('id', ident), CP('name', name)] for (ident,name) in results] 

Но вы упомянули map, которые вы также можете использовать:

final = map(lambda (ident,name): [CP('id',ident),CP('name',name)], results) 

(Обратите внимание, что я не назвал идентификатор переменной id, поскольку это конфликтует с существующей глобальной функцией в Python.)

В Python, средства анализа/генераторы обычно предпочтительнее, чем map, поскольку они более общие и, возможно, более разборчивые. По общему признанию, относительная нехватка общности в map во многом объясняется тем, что конструкция Python lambda для создания анонимных функций довольно ограничена по сравнению с тем, что доступно на более функциональных языках, где map и друзья правят высшим.

+1

«Понятия/генераторы, как правило, предпочтительнее, чем« карта », или в любом случае над« map' * с лямбдой *. 'map' с именованной функцией, которую вы обнимаете, имеет тенденцию выглядеть намного лучше, поэтому это более близкий вызов. Нельзя сказать, что нет людей, которые по-прежнему предпочитают '[foo (x) для x в баре]' over 'map (foo, bar)', и особенно над эквивалентным «Python 3» списком (map (foo, bar)) '. Тем не менее, я думаю, что это отнюдь не единогласно. –

+0

Не знаю, почему я не рассматривал генератор Doh !! Хорошая работа! – rh0dium

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