使map()返回字典

13 投票
4 回答
17094 浏览
提问于 2025-04-16 11:00

我有一个这样的函数:

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 个回答

3

在编程中,有时候我们会遇到一些问题,想要找到解决办法。比如说,有人可能在使用某个工具或库时,遇到了错误或者不明白的地方。这时候,大家通常会去StackOverflow这样的论坛上提问,看看有没有人遇到过类似的问题,并找到解决方案。

在这些讨论中,其他程序员会分享他们的经验,给出建议,或者提供代码示例来帮助理解。有时候,问题的解决方案可能很简单,只需要调整一些设置,或者更新到最新版本的工具。

总之,StackOverflow是一个很好的地方,可以让你向其他人请教问题,学习新知识,提升自己的编程技能。

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

没错。这里的基本问题是,你不能用单个的 dict 来创建一个字典,而是要用一系列长度为二的序列 (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.1)中,可以直接使用字典推导式:

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

那为什么要用 map() 呢?

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

应该可以正常工作。

撰写回答