Python使用新的键顺序将defaultdict复制到dict

Python使用新的键顺序将defaultdict复制到dict,python,python-2.7,dictionary,Python,Python 2.7,Dictionary,我有一个按键值未排序的defaultdict: d = defaultdict(int) ... defaultdict(<type 'int'>, {'2014-06-30': 2, '2013-04-18': 7, '2013-04-19': 9}) 并创建新的dict: nd = {} for i in tmp: nd[i] = d[i] 但结果我得到了源代码的精确副本。 尽管我以新的顺序添加了元素。dict实例是任意顺序的。如果您想要一个特定的顺序,那么请改用。p

我有一个按键值未排序的defaultdict:

d = defaultdict(int)
...
defaultdict(<type 'int'>, {'2014-06-30': 2, '2013-04-18': 7, '2013-04-19': 9})
并创建新的dict:

nd = {}
for i in tmp:
    nd[i] = d[i]
但结果我得到了源代码的精确副本。
尽管我以新的顺序添加了元素。

dict实例是任意顺序的。如果您想要一个特定的顺序,那么请改用。

python字典不是这样工作的。字典实际上是一个散列映射,这意味着根据键散列,而不是您放置项的顺序,将值放置在dict中的某个位置。迭代时,您将不会得到有序dict。请改用OrderedDict类

from collections import OrderedDict  
ord_dict = OrderedDict()

for i in tmp:
    ord_dict[i] = d[i]
print(ord_dict)
OrderedDict([('2013-04-18', 7), ('2013-04-19', 9), ('2014-06-30', 2)])
或者正如@jon Clements简单地建议的那样:

OrderedDict(sorted(d.iteritems()))

或者使用python 3的OrderedDictsortedd.items,您可能需要OrderedDictsortedd.iteritems?也不会称之为ord,因为这是一个内置函数…@JonClements,正在编写它,是的,你是对的,改变了ord。好吧,如果你真的希望它是2.x/3.x交叉兼容的,那么在sortedd中为k订购了dictk,d[k],但这有点荒谬:@JonClements。我想我现在会保持简单:
OrderedDict(sorted(d.iteritems()))