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