Python 字典是怎样分类的?

Python 字典是怎样分类的?,python,Python,女士们,先生们 我有一个关于python词典的问题。在玩的时候,我注意到一些对我来说很奇怪的事情 我这样定义一个dict stuff={'age':26,'name':'Freddie Mercury','ciy':'符拉迪沃斯托克'} 然后,我将“第一”一词添加到如下内容中: stuff[1]=“第一” 当我把它打印出来的时候,就没事了 东西 {1:'第一','年龄':26,'姓名':'弗雷迪水星','城市':'符拉迪沃斯托克'} 然后我加上第二个字: stuff[2]=“秒” 这很好,但是当

女士们,先生们

我有一个关于python词典的问题。在玩的时候,我注意到一些对我来说很奇怪的事情

我这样定义一个dict

stuff={'age':26,'name':'Freddie Mercury','ciy':'符拉迪沃斯托克'}

然后,我将“第一”一词添加到如下内容中:

stuff[1]=“第一”

当我把它打印出来的时候,就没事了

东西

{1:'第一','年龄':26,'姓名':'弗雷迪水星','城市':'符拉迪沃斯托克'}

然后我加上第二个字:

stuff[2]=“秒”

这很好,但是当我显示我得到的内容时:

东西

{1:'第一','年龄':26,2:'第二','姓名':'弗雷迪·墨丘利','城市':'符拉迪沃斯托克'}

**请注意,2现在是第三个元素,而不是第二个(按顺序)或第一个(如果元素添加到开头)元素

当我加入第三个元素“wtf”时,突然一切都恢复了正常,我很困惑到底发生了什么

stuff[3]=“wtf”

东西

{1:'first',2:'second',3:'wtf','name':'Freddie Mercury','age':26,'city':'符拉迪沃斯托克'}


有人能给我解释一下这是怎么回事吗?

字典是无序的数据结构,因此您不应该期望从字典中得到的顺序是未定义的。你不应该依赖它。在本例中,它恰好取决于基础键的散列值,但您不应该假设情况总是这样

如果顺序对您很重要,那么use应该使用(因为Python 2.7):


了解哈希表是什么:


简而言之,dict有一个内部数组,并在通过哈希函数选择的插槽中插入值。此函数的本质是将条目均匀分布。

列表中,元素按其索引(在列表中的位置)排序

对于所有密集的用途来说,字典是一个袋子。事情可能会改变,但你不应该担心。您可以通过其
键访问项目。您可以将键视为标签,它唯一地标识它们的

stuff = {} # hey python, please create a bag called stuff.
stuff[1]='first' # hey python, please put the string 'first' in my bag called stuff. 
                 # if I ever need to access 'first' from this bag, I will ask for 1
                 # so please attach the label (key) 1 to the item (value) 'first'
print stuff[1]   # hey python, please find the thing in my bag called stuff
                 # that has a label with 1 attached to it


print stuff[2]   # hey python, please find the thing in my bag called stuff
                 # that has a label called 1 attached to it
Traceback (most recent call last):
  File "<stdin>", line 3, in <module>
KeyError: 2      # python says "hey programmer, nothing in your bag called stuff has a label with 2 attached to it
stuff={}#嘿,python,请创建一个名为stuff的包。
stuff[1]=“first”#嘿,python,请把字符串“first”放在我的stuff包中。
#如果我需要从这个包访问“first”,我会要求1
#因此,请将标签(键)1贴在项目(值)“first”上
打印东西[1]#嘿,python,请在我包里找到一个叫做东西的东西
#有一个带有1的标签
打印资料[2]#嘿,python,请在我包里找到一个叫做资料的东西
#上面贴着一个名为1的标签
回溯(最近一次呼叫最后一次):
文件“”,第3行,在
KeyError:2#python说“嘿,程序员,你包里没有一个叫做stuff的东西有一个2标签
希望这有帮助

关于订单有一些(重要的)保证。来自文档(Python 2.7.2):

如果项()、键()、值()、iteritems()、iterkeys()和 调用itervalues()时不会对 字典,列表将直接对应。这允许 使用zip()创建(值、键)对:pairs=zip(d.values(), d、 键())。iterkeys()和 itervalues()方法:pairs=zip(d.itervalues(),d.iterkeys()) 为对提供相同的值。创建相同列表的另一种方法 is pairs=[(v,k)表示d.iteritems()中的(k,v)]


内置dict不保证插入或删除后键的顺序


如果您想保持插入顺序(按键插入/更新时间或按键+值插入/更新时间)或按键排序,请使用我编写的orderddict包。它是用C实现的(因此仅适用于CPython,但速度几乎与内置的
dict
).

这是否意味着每次我打印内容时,顺序可能会改变?是的,没错。但实际上,我只希望在添加或删除键时顺序会改变-换句话说,如果你连续打印两次口述,而不添加或删除中间的任何内容,则顺序可能会相同。不过,不要指望这一点。波特本质上。在实践中,顺序应该是稳定的,但可以在密钥更改时随时更改。如果您确实需要依赖稳定的顺序,您可以在从字典中提取密钥时对其进行排序,或者使用
OrderedDict
类。这与密钥哈希的顺序有关,而不是密钥本身。但这是一个internal实现详细信息,您不能依赖它。@DavidZaslavsky如果您在不添加或删除顺序的情况下打印两次dict,则保证相同。请参阅“如果调用items()、keys()、values()、iteritems()、iterkeys()和itervalues(),并且没有对字典进行干预性修改,则列表将直接对应。”
stuff = {} # hey python, please create a bag called stuff.
stuff[1]='first' # hey python, please put the string 'first' in my bag called stuff. 
                 # if I ever need to access 'first' from this bag, I will ask for 1
                 # so please attach the label (key) 1 to the item (value) 'first'
print stuff[1]   # hey python, please find the thing in my bag called stuff
                 # that has a label with 1 attached to it


print stuff[2]   # hey python, please find the thing in my bag called stuff
                 # that has a label called 1 attached to it
Traceback (most recent call last):
  File "<stdin>", line 3, in <module>
KeyError: 2      # python says "hey programmer, nothing in your bag called stuff has a label with 2 attached to it