Python: 创建一个有序的空字符串字典

4 投票
4 回答
857 浏览
提问于 2025-04-18 16:38

请理解,我并不是在寻找像这个问题中提到的默认有序字典。我想要的是类似的东西。

如果我从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)])

撰写回答