Python有序字典转普通字典

3

我有一个类似于

[('first', 1), ('second', 2), ('third', 3)]

我希望有一个内置函数能够实现类似以下的功能:
{'first': 1, 'second': 2, 'third': 3}

有没有内置的Python函数可以代替循环来处理此问题?

需要适用于Python版本大于等于2.6。


1
您的输入不是有序字典,而是元组列表。您想保留条目的顺序吗? - Tim Pietzcker
你是否正在使用collections.OrderedDict - jamylak
我在 inspect.getframeinfo(frame) 上调用了 __dict__。 - WojonsTech
@jamylak,请看上面的评论。 - WojonsTech
3个回答

9

dict可以接收一个元组列表,并将它们转换为键值对。

>>> lst = [('first', 1), ('second', 2), ('third', 3)]
>>> dict(lst)
{'second': 2, 'third': 3, 'first': 1}

4

只需将 dict() 应用于列表:

In [2]: dict([('first', 1), ('second', 2), ('third', 3)])
Out[2]: {'first': 1, 'second': 2, 'third': 3}

1

并不像Volatility回答中提出的dict(my_list)那样简洁明了...

我还想建议:

my_list = [('first', 1), ('second', 2), ('third', 3)]
my_dict = {k:v for k,v in my_list}

当你需要从原始序列中过滤一些元素时,它会更加有用。

my_list = [('first', 1), ('second', 2), ('third', 3)]
my_dict = {k:v for k,v in my_list if k!='third'}

or

my_dict = {k:v for k,v in my_list if test_value(v)} # test_value being a function return bool

评论说它只适用于Python版本>= 2.7


1
我认为最符合Python风格的是不使用dict(my_list)。但是我大多数时候都在使用列表和字典推导式,所以我会在Python >= 2.7中使用它。我建议使用这种方法,因为大多数情况下元素上都有条件,这些条件将构成最终的字典,而字典推导式和列表推导式机制使得过滤变得非常容易 my_dict = {k:v for k,v in my_list if k != 'third'}。我在问题中添加了一些其他示例。 - Stephane Rolland
1
在这种情况下绝对没有使用它的理由。dict(...)更快,外观更好,并且适用于每个Python版本。这仅适用于>= 2.7。 - jamylak
谢谢,这很有帮助。我会记住这个方法,因为它可以过滤掉一些不需要复制到新字典中的内容,这样可以节省大量内存空间。 - WojonsTech
@StephaneRolland 我不能在这个项目中使用它,但我不会忘记这个技巧。我有一种感觉它在2.6版本中不起作用。我必须清理掉类似的东西,才能让这个项目的代码库在2.6版本上运行。而我关心2.6版本的唯一原因是它要在客户服务器上运行,我无法强制他们升级。 - WojonsTech
1
@Stepane Rolland 在没有筛选的情况下,当您“即兴”创建字典值时,字典赞赏更有效,例如{x:x2 for x in xrange(100)}比dict((x,x2) for x in xrange(100))更快。 尽管在过滤字典时,使用字典赞赏也更加高效。 - volcano
显示剩余5条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接