функция python dict str () надежно сортирует ключи? - PullRequest
6 голосов
/ 28 ноября 2011

в python, и dict {1:1,2:2,3:3}, и {3:3,2:2,1:1} выдают "{1:1,2:2,3:3}", когда str () 'd?

Могу ли я рассчитывать на эту сортировку или хотя бы на тот факт, что дикты, содержащиеодна и та же пара ключей / значений будет генерировать одну и ту же строку при передаче через функцию str ()?

Ответы [ 4 ]

6 голосов
/ 28 ноября 2011

Вы не можете полагаться ни на одно из этих двух свойств. Порядок словаря при преобразовании в строку зависит также от порядка вставки пар ключ / значение.

Имея немного знаний об исходном коде Python (смотрите The Mighty Dictionary из PyCon 2010), или немного проб и ошибок, вы можете легко найти примеры счетчиков:

>>> {1: 1, 9: 9}
{1: 1, 9: 9}
>>> {9: 9, 1: 1}
{9: 9, 1: 1}
4 голосов
/ 28 ноября 2011

Встроенный тип dict не гарантирует какой-либо определенный порядок ключей.

Даже если кажется, что вы всегда получаете одну и ту же строку, не полагайтесь на это. В противном случае при обновлении Python может произойти изменение в реализации, из-за которого ваше предположение не будет выполнено.

Класс OrderedDict обеспечивает гарантии порядка ключей.

1 голос
/ 28 ноября 2011

Нет, вы не можете. Попробуйте это:

{ i:i for i in range(0, 100, 10) }

Причина, по которой это работает для смежных целых чисел, начинающихся с нуля, состоит в том, что каждое целое число хэширует себя (hash(i) == i), а словари имеют размеры своих внутренних таблиц, чтобы они были как минимум такими же большими, как у элементов, которые они содержат (они используют стратегию зондирования, что требует этого). Следовательно, целое число i заканчивается в слоте i без коллизий. Вы также обнаружите, что смежные целые числа, начинающиеся с некоторого другого числа, также имеют тенденцию к монотонному увеличению, но они могут обернуться где-то посередине:

>>> { i:'' for i in range(25, 35) }
{32: '', 33: '', 34: '', 25: '', 26: '', 27: '', 28: '', 29: '', 30: '', 31: ''}

Важно отметить, что это всего лишь наблюдения за фактическим поведением. Ничто в языке не гарантирует этого, поэтому вы не можете на это полагаться.

1 голос
/ 28 ноября 2011

Нет, Вы не можете полагаться на это .Как упомянуто в Learning Python.4-е издание, Марк Лутц (стр. 94.):

(...) , так как словари не являются последовательностями, они не поддерживают надежный порядок слева направо.Это означает, что если мы создадим словарь и напечатаем его обратно, его ключи могут вернуться в другом порядке , чем тот, в котором мы их набрали (...)

Однаков книге упоминается другое решение для печати пар ключ-значение в порядке ключей (D - это словарь, который вы хотите распечатать):

>>> for key in sorted(D):
    print(key, '=>', D[key])

Используя вышеприведенное, вы можете печатать элементы в любомкак вам нравится, или даже создать некоторую последовательность, содержащую упорядоченные элементы, например:

>>> D = {'a': 12, 'b': 65, 7: 'asd'}
>>> S = [(key, D[key]) for key in sorted(D)]
>>> S
[(7, 'asd'), ('a', 12), ('b', 65)]

, где порядок элементов в S является надежным (вы можете зависеть от него, так какне изменится, пока вы не измените его явно).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...