python字典中返回值的随机顺序

DCa*_*ugs 2 python

我不明白这一点,它会困扰我直到我明白。

此 python 代码计算每个字符出现在 'message' 变量中的次数:

message = 'Some random string of words'

dictionary= {}

for character in message.upper():
    dictionary.setdefault(character,0)
    dictionary[character] = dictionary[character] + 1

print(dictionary)
Run Code Online (Sandbox Code Playgroud)

如果您多次运行它,您会注意到计数每次都以看似随机的顺序返回。为什么是这样?我认为循环应该每次都从字符串的开头开始,并以一致的顺序返回值……但事实并非如此。是否有随机性的一些元素在setdefault()print()upper()方法,这也影响着字符串处理的顺序?

Ste*_*ann 5

因为两点:

  • 字典“没有排序”。您当然会得到一些订单,但这取决于键的散列值等。
  • 您使用(单字符)字符串作为键,并且字符串散列是随机的。如果您这样做print(hash(message))或什至刚刚这样做,print(hash('c'))您会发现从一次运行到下一次运行也有所不同。

因此,由于顺序取决于散列,并且散列从一次运行到下一次运行会发生变化,因此您当然可以获得不同的订单。

另一方面,如果您在同一次运行中重复它,您可能会得到相同的顺序:

message = 'Some random string of words'
for _ in range(10):
    dictionary= {}
    for character in message:
        dictionary.setdefault(character,0)
        dictionary[character] = dictionary[character] + 1
    print(dictionary)
Run Code Online (Sandbox Code Playgroud)

我刚刚运行了它,正如预期的那样,它总共打印了十次完全相同的订单。然后我再次运行它,它打印了一个不同的订单,但同样十次。正如预期的那样。