Python: 创建一个有序的空字符串字典
请理解,我并不是在寻找像这个问题中提到的默认有序字典。我想要的是类似的东西。
如果我从collections模块调用OrderedDict,我可以这样做 -
from collections import OrderedDict
my_ordered_dict = OrderedDict()
然后我可以像这样设置项目,这会调用setitem函数,我想这里面有一些神奇的东西发生 -
my_ordered_dict[key1] = value1
my_ordered_dict[key2] = value2
my_ordered_dict[key3] = value3
这样就能得到一个完美的OrderedDict -
>my_ordered_dict
{key1:value1, key2:value2, key3:value3...}
但是,当我尝试像这样初始化我的键值对时:
my_ordered_dict = {key1 : value1,
key2 : value2,
key3 : value3...}
字典就失去了顺序。
我可以通过不初始化一个元组列表来解决这个问题:
default = [ (key1, value1), (key2, value2), (key3, value3)]
for pair in default:
my_ordered_dict[pair[0]] = pair[1]
但我觉得我可能漏掉了什么。有什么建议吗?
4 个回答
0
如果你使用:
my_ordered_dict = {key1 : value1,
key2 : value2,
key3 : value3...}
那是一个普通的(无序的)字典,你需要这样做:
my_ordered_dict = OrderedDict(((key1, value1), (key2, value2), (key3, value3)))
1
你需要这样初始化 OrderedDict,才能创建一个 OrderedDict:
>>> dct = OrderedDict(((key1, value1), (key2, value2), (key3, value3)))
>>> type(dct)
<class 'collections.OrderedDict'>
也就是说,像这样创建的字典会生成一个普通的字典,而不是 OrderedDict:
>>> dct = {key1: value1, key2 : value2, key3 : value3}
>>> type(dct)
<type 'dict'>
可以查看 Python 的文档,里面有一些 很好的 OrderedDict 示例。
2
每当你写:
{'key1': 'value1', 'key2': 'value2', 'key3': 'value3'}
这段代码会被当作普通的字典来处理,因此顺序会立刻丢失。在你的例子中,你是用一个普通字典覆盖了 my_ordered_dict
。
相反,你可以使用一个包含元组的列表:
OrderedDict([('key1', 'value1'), ('key2', 'value2'), ('key3', 'value3')])
4
这个是可以工作的:
my_ordered_dict = OrderedDict(( (key1, value1), (key2, value2), (key3, value3) ))
之所以能工作,是因为我们使用的参数是元组,而元组是有顺序的。
同样因为元组是有顺序的,这个也能工作:
my_ordered_dict = OrderedDict()
my_ordered_dict.update(( (key1, value1), (key2, value2), (key3, value3) ))
相反,这个不能工作:
my_ordered_dict = OrderedDict({key1:value1, key2:value2,})
上面传给OrderedDict
的参数是一个无序字典。创建时就已经失去了所有的顺序。
有趣的是,虽然无序字典失去了顺序,但我们可以重新给它加上顺序,下面的例子来自于collections模块的文档:
>>> # dictionary sorted by key
>>> OrderedDict(sorted(d.items(), key=lambda t: t[0]))
OrderedDict([('apple', 4), ('banana', 3), ('orange', 2), ('pear', 1)])
>>> # dictionary sorted by value
>>> OrderedDict(sorted(d.items(), key=lambda t: t[1]))
OrderedDict([('pear', 1), ('orange', 2), ('banana', 3), ('apple', 4)])
>>> # dictionary sorted by length of the key string
>>> OrderedDict(sorted(d.items(), key=lambda t: len(t[0])))
OrderedDict([('pear', 1), ('apple', 4), ('orange', 2), ('banana', 3)])