Ответ 1
Если на "недетерминированный" означает порядок, в котором появляются словарные ключи (когда вы перебираете словарь), изменяется от run to run, а словарные клавиши - строки, скажите так, Тогда я могу помочь. Но пока вы ничего не сказали об этом: -)
Предполагая, что проблема, здесь небольшая программа:
d = dict((L, i) for i, L in enumerate('abcd'))
print(d)
а вывод из 4 работает под Python 3.3.2:
{'d': 3, 'a': 0, 'c': 2, 'b': 1}
{'d': 3, 'b': 1, 'c': 2, 'a': 0}
{'d': 3, 'a': 0, 'b': 1, 'c': 2}
{'a': 0, 'b': 1, 'c': 2, 'd': 3}
В этой части вывода python -h
вызывается причина:
Other environment variables:
...
PYTHONHASHSEED: if this variable is set to 'random', a random value is used
to seed the hashes of str, bytes and datetime objects. It can also be
set to an integer in the range [0,4294967295] to get hash values with a
predictable seed.
Это полузащищенное "исправление безопасности", предназначенное для предотвращения атак DOS, основанных на построении входных данных dict, которые спровоцировали поведение в квадратичном режиме. "random" является значением по умолчанию в Python3.
Вы можете отключить это, установив envar PYTHONHASHSEED в целое (ваш выбор - выберите 0, если вам все равно). Затем итерация dict со строковыми клавишами будет производить их в том же порядке в течение пробегов.
Как @AlcariTheMad сказал в комментарии, вы можете включить поведение Python3 по умолчанию в Python 2 через python -R ...
.