我有以下功能:
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
(或类似的东西)只返回一个字典而不是一个字典数组?
答案 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()]