从列表推导式创建有序字典?

10

这里有一个列表推导式:

L = [{k: d[k](v) for (k, v) in l.iteritems()} for l in L]

其中

  • L 是一个有序字典列表(即collections.OrderedDict对象),其中每个字典都具有相同的键集。

  • d 是另一个有序字典,其键集与之前的有序字典相同。

  • 对于每个keyd[key]是一个可以应用于L[i][key]的函数,即d[key](L[i][key])

所有给定的字典都是有序字典,并且它们的键具有相同的顺序。

但是代码将创建一个无序字典。如何创建一个具有与给定有序字典相同键顺序的有序字典?

2个回答

9

collections.OrderedDict 就是一个字典,它会记住元素添加的顺序。所以你可以通过构造函数来创建一个有序字典,如下:

[OrderedDict((k, d[k](v)) for (k, v) in l.iteritems()) for l in L]

为什么字典不是有序的?dict1 = OrderedDict({x: x**5 for x in (1, 5, 10)}).__class__ ord_dict = OrderedDict({x: x**5 for x in (1, 5, 10)}) print(ord_dict) # OrderedDict([(1, 1), (10, 100000), (5, 3125)])``` - Rohit Dhankar
1
@RohitDhankar,您已经在您的案例中创建了一个字典。数据已经无序地存储在内存中。OrderedDict与此处的意外顺序无关。 - thefourtheye

4

Python字典与C++字典不同,因为它使用哈希来存储键值对,所以是无序的。另一种选择是使用Python字典的有序特化版本,称为collections.OrdredDict

这将使您的声明变为:

from collections import OrderedDict
L = [OrderedDict((k, d[k](v)) for (k, v) in l.iteritems()) for l in L]

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