2011-02-01 75 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() 
    ) 

應該工作。

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

編輯:正如評論說,dict()在這種情況下更容易。但是,只有理論上的緣故,我的意思是,它可能只使用功能構建塊來解決(不Python的魔法字典解析):

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 2011-02-01 13:59:21

+1

沒關係,在這種情況下,帶列表理解的dict()是更快的解決方案。但從理論上說,你想要一個工會和一個空的字典,這正是我的目標的摺疊... – sinelaw 2011-02-01 14:07:05

6

是的。基本的問題是,你不會創建一個單詞條目dict s的字典,而是從一個長度爲2的序列(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(('{t}.{c}'.format(t=h.table_name, c=h.column_name), h.position) 
    for h in self.heading_set.all()) 

或者,在最新版本(2.7,3.0)上。1)直接字典解析:

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