2011-02-01 4 views
7

У меня есть следующие функции:Сделать карту() возвращает словарь

def heading_positions(self): 
    return map(
      lambda h: 
       {'{t}.{c}'.format(t=h.table_name,c=h.column_name) : h.position }, 
       self.heading_set.all() 
      ) 

Это дает мне такой вывод:

[{'customer.customer_number': 0L}, {'customer.name': 2L}, ... ] 

Я предпочел бы только один словарь, как это:

{'customer.customer_number': 0L, 'customer.name': 2L, ... 

Есть ли способ сделать map (или что-то подобное) вернуть только один словарь вместо массива дикции Овен?

ответ

7

Почему map() тогда?

dict(
    ('{t}.{c}'.format(t=h.table_name, c=h.column_name), h.position) 
    for h in self.heading_set.all() 
    ) 

должно работать.

+3

Или '{'{t}. {C}'. Format (...): h.position для h в self.heading_set.all()}' в более поздних версиях (с признаками dict). – delnan

+1

Понятия Дикта появляются в 2.7/3.1. –

2
return dict(('{t}.{c}'.format(t=h.table_name, c=h.column_name), h.position) 
      for h in self.heading_set.all()) 
1

Как и другие ответы, вы можете использовать dict() соображения.

Но, как любопытство, возможно, вы также можете использовать reduce

EDIT: Как говорится в комментариях, dict() проще в этом случае. Но, ради теории только, что я имел в виду, что можно решить, используя только функциональные блоки (без магических словарных постижений питона):

def union(d1,d2): 
    result = {} 
    result.update(d1) 
    result.update(d2) 
    return result 

Тогда:

reduce(union, sequence_of_dictionaries, {}) 

С другой стороны, менее чистые, но более эффективно, используя альтернативный вариант dict.update, который возвращает свой первый аргумент:

def update2(d1, d2): 
    dict.update(d1, d2) 
    return d1 

Или даже:

update2 = lambda d1,d2: (d1, d1.update(d2))[0] 

Тогда:

reduce(update2, sequence_of_dictionaries, {}) 

Где в этом случае sequence_of_dictionaries будет:

[{'{t}.{c}'.format(t=h.table_name, c=h.column_name) : h.position} 
for h in self.heading_set.all()] 
+0

...... Для чего? – eumiro

+1

Не обращайте внимания, dict() с пониманием списка является более быстрым решением в этом случае. Но, теоретически, вы хотите сбросить соединение и пустой дикт, к чему я стремился ... – sinelaw

+0

Если ваш ответ неверен, удалите его или исправьте. Если это правильно, укажите пример того, как это сделать. – agf

6

Да. Основная проблема заключается в том, что вы не создаете словарь из однозадачного dict s, но из последовательности последовательностей длины-двух (key, value).

Таким образом, вместо того, чтобы создать независимую однократную dict с помощью функции, создать кортеж, а затем вы можете использовать dict() конструктор:

dict(map(lambda h: ('{t}.{c}'.format(t=h.table_name, c=h.column_name), h.position), 
     self.heading_set.all())) 

Или напрямую использовать генератор или список понимание внутри конструктора Dict :

dict(('{t}.{c}'.format(t=h.table_name, c=h.column_name), h.position) 
    for h in self.heading_set.all()) 

Или, в последних версиях (2.7, 3.1) понимание словаря напрямую:

{'{t}.{c}'.format(t=h.table_name : c=h.column_name), h.position) 
    for h in self.heading_set.all()} 
Смежные вопросы