2014-09-14 1 views
-2

Я знаю, что словари сами в Python не имеют порядка. Тем не менее, мне очень любопытно, когда вы вызываете str() в словаре, если он всегда в одном порядке. Оказывается, чтобы быть отсортированы (по ключу), независимо от того, в каком порядке я добавляю элементы:Строковые представления словарей имеют порядок в Python 3.4?

d={} 
d[5]=5 
d[1]=1 
d["z"]="z" 
d["a"]="a" 
s=str(d) 
print(s) 

Я знаю много людей, будет соблазн сказать, что это не отсортирован, но, пожалуйста, пытаются доказать, что я неправ, получая несортированный Результаты.

Итак, словари, преобразованные в строки, отсортированные по умолчанию в Python 3.4?

ответ

3

Примечание: Python 3.6 вводит новый, order-preserving implementation из dict, что делает следующее устаревают из 3.6.


Вот три итерации вашего примера в трех различных сессий Python 3.4 переводчика:

Python 3.4.1 (default, Aug 8 2014, 15:05:42) 
[GCC 4.8.2] on linux2 
Type "help", "copyright", "credits" or "license" for more information. 
>>> d={} 
>>> d[5]=5 
>>> d[1]=1 
>>> d["z"]="z" 
>>> d["a"]="a" 
>>> s=str(d) 
>>> print(s) 
{1: 1, 'z': 'z', 'a': 'a', 5: 5} 
Python 3.4.1 (default, Aug 8 2014, 15:05:42) 
[GCC 4.8.2] on linux2 
Type "help", "copyright", "credits" or "license" for more information. 
>>> d={} 
>>> d[5]=5 
>>> d[1]=1 
>>> d["z"]="z" 
>>> d["a"]="a" 
>>> s=str(d) 
>>> print(s) 
{1: 1, 'a': 'a', 5: 5, 'z': 'z'} 
Python 3.4.1 (default, Aug 8 2014, 15:05:42) 
[GCC 4.8.2] on linux2 
Type "help", "copyright", "credits" or "license" for more information. 
>>> d={} 
>>> d[5]=5 
>>> d[1]=1 
>>> d["z"]="z" 
>>> d["a"]="a" 
>>> s=str(d) 
>>> print(s) 
{1: 1, 5: 5, 'z': 'z', 'a': 'a'} 

Таким образом, нет, строковое представление не является сортироваться или даже в том же порядке через вызовы интерпретации Reter. В версиях Python, вплоть до 3.2, порядок словарей (и их строковые представления) был произвольным, но последовательным - однако, это изменилось в Python 3.3 в результате security fix:

По умолчанию, __hash__() значения объектов str, bytes и datetime «соленые» с непредсказуемым случайным значением. Хотя они остаются постоянными в рамках отдельного процесса Python, они не предсказуемы между повторными вызовами Python.

Это предназначено для обеспечения защиты от отказа в обслуживании, вызванного тщательно подобранными входами, которые используют наихудшую производительность вложения вложения, сложность O (n^2). См. http://www.ocert.org/advisories/ocert-2011-003.html.

Изменение значений хэша влияет на порядок итераций диктов, множеств и других отображений. Python никогда не предоставлял гарантии об этом заказе (и обычно он варьируется между 32-битными и 64-битными сборками).

3

Нет, они не являются.

import string 

d = {} 
for ch in string.ascii_lowercase: 
    d[ch * 20] = ch 
print(d) # OR print(str(d)) 

выход (будет меняться каждый раз, когда вы запускаете из хэш-рандомизации):

{'jjjjjjjjjjjjjjjjjjjj': 'j', 'ssssssssssssssssssss': 's', 'mmmmmmmmmmmmmmmmmmmm': ... 
+0

Интересно. Однако, когда я делаю код, указанный здесь, http://pastebin.com/Rijtr3Mx, я получаю тот же результат каждый раз, хотя он не отсортирован. Получаете ли вы тот же результат, который я делаю там с тем же кодом? – Shule

+0

Не обращайте внимания на вопрос, остается ли это до тех пор, пока я не закрою переводчика и не открою его снова. – Shule