Python 3 中有序字典的表示形式为什么是([])而不是{}?

od = OrderedDict([(‘a’, 1), (‘c’, 2), (‘b’, 3)])
od
OrderedDict([(‘a’, 1), (‘c’, 2), (‘b’, 3)])
test=collections.OrderedDict()
test[‘张三’] = 92
test[‘李四’] = 85
test
OrderedDict([(‘张三’, 92), (‘李四’, 85)])
Python 3 中有序字典的表示形式为什么是([])而不是{}?

29 回复

看了你的发帖记录我并不想回复,甚至想 block


这个问题问得挺有意思的。Python 3.7 之后,字典(dict)确实已经保持了插入顺序,但 OrderedDict 和普通 dictrepr() 输出依然不同,这主要是为了向后兼容和明确类型。

你看,OrderedDict([('a', 1), ('b', 2)]) 这种 ([...]) 的表示形式,其实是在模仿它的构造函数。OrderedDict 的构造函数可以接受一个可迭代的键值对序列(比如列表的列表),所以 repr() 就原样输出了这个形式。这样你直接把 repr() 的输出复制粘贴回去,就能重建一个一模一样的对象,这是 repr() 的设计原则。

而普通字典 {'a': 1, 'b': 2} 用花括号,是更早、更传统的语法。虽然现在它也有序了,但为了不破坏已有代码(比如那些依赖 repr() 输出格式的),就没去改它的显示方式。

所以简单说,OrderedDict([...]) 是为了清晰展示它的构造方式并保持兼容性,而 {} 是字典的语法糖,两者历史不同。现在你大部分时候用普通 dict 就行,需要强调顺序特性或用到 OrderedDict 特有方法(比如 move_to_end)时才用它。

总结:主要是历史原因和明确类型。

你管它是什么格式干什么,只有拥有字典的特性,由是有序的不就行了。
你看到的只是__repr__方法让你看到的样子,你也可以让普通字典显示为([])这种格式。

突然想换语言了。你真的是基础语法不看,完上手就撸吗,这问的相当于为什么 1x1 代码里面要写成 1*1 嘛

基础太薄弱,建议找本入门书从第一页开始从头到尾认真看一遍。

张三和李四不一样,是因为张三就是张三,他不是李四啊。

一天伸手好多次。。

而且还很没礼貌,真实让人讨厌

大家一起 block 吧…

这种没礼貌的同学能否在站规中加以限制? 我又感觉我们需要 downvote 的功能了, 如果一个人短时间在一个节点中的回复被 downvote 太多, 禁止发帖或回复什么的.

你们可以看看楼主的这个帖子,笑死我了

/476354

如果是 {k:v} 这种形式,那么在调用 OrderedDict 的“构造函数“ __init__ 时,
你是先生成一个 无序字典{k:v},然后再传给 OrderedDict。
也就是说,你已经破坏了顺序。
所以应该用 list, tuple 这种有序结构,保证 OrderedDict 知道你的顺序。

接 #12,另外,提问建议还是保留点虚心的态度。




其实也不必太计较,感觉就是个小学生学 python 而已


你应该学学网上发布那个 7 岁小孩打 110,虽然紧张,但该说的都能清楚表达,记忆、表达的条理都清晰

你平时习惯 dict({“one”: 1, “two”: 2, “three”: 3}) 这样写么?

手册都写了
>>> a = dict(one=1, two=2, three=3)
>>> b = {‘one’: 1, ‘two’: 2, ‘three’: 3}
>>> c = dict(zip([‘one’, ‘two’, ‘three’], [1, 2, 3]))
>>> d = dict([(‘two’, 2), (‘one’, 1), (‘three’, 3)])
>>> e = dict({‘three’: 3, ‘one’: 1, ‘two’: 2})
>>> a == b == c == d == e
True

e 这种情况是最少见的,因为类似的 b 简单多了
你要明白 dict()和 OrderedDict()最主要是转换,并不是从一个 dict 变为另一个 dict

你是不是写惯了 powershell ?以为类似[ordered]{}就搞定有序 dict 有序化

又让他有序,又让他和字典长一个样

#11

“ d 等于白说,没说重点” hhhh

真的是听了想打人 hhh
问别人问题还有这么大爷的太可怕了

class OtherDict:
def init(self,*args):
self._k = []
self._v = []
for k,v in args[0]:
self._k.append(k)
self._v.append(v)
def getitem(self,name):
try:
return self._v[self._k.index(name)]
except ValueError:
raise KeyError
def repr(self):
str_list = []
for i in range(len(self._k)):
s = str(self._k[i]) + ‘~’ + str(self._v[i])
str_list.append(s)
return ‘Oh! You want see me?’ +’「’+’,’.join(str_list)+’」'

a = OtherDict([(‘a’, 1), (‘c’, 2), (‘b’, 3)])

print(a) #Oh! You want see me?「 a ~ 1,c ~ 2,b ~ 3 」

a[‘a’] #1

随便写了一下,python 自省威力很强大,很多神奇的功能都是靠自省实现的。但初学就不要深究细节,好好写一下代码


其实他应该去 CSDN,而不是这里


你们都当大神呀。人家问点基础的知识咋了。你看不上就别回答。


即将下班划水很正常啊:)

#21 你是不是搞错了什么?我并没有回答啊 : )

我是看不惯你拽的样子

你很拽呀。除了嘲讽人家新手还会干嘛

楼主怎么不出来怼两句了,看你之前的发帖别人会打得不好你不是都会怼回去吗

想起来四个字母 RTFI

spam block

让我想起以前师兄提的一句话:不要过早的陷入细节。
可能 up 就处于这种情况,建议先实现主体功能,这些细节的问题后续慢慢就明白了

回到顶部