make map()返回一个字典

时间:2011-02-01 13:54:13

标签: python

我有以下功能:

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(或类似的东西)只返回一个字典而不是一个字典数组?

4 个答案:

答案 0 :(得分:7)

为什么然后使用map()

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

应该有用。

答案 1 :(得分:7)

是。基本问题是你不是用单项dict创建一个字典,而是从一系列长度为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构造函数中使用生成器或列表推导:

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()}

答案 2 :(得分:2)

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

答案 3 :(得分:2)

正如其他答案所示,您可以使用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()]