2012-07-05 3 views
3

Могу ли я быть уверенным в заказе в словаре Python?Могу ли я быть уверенным в заказе в словаре?

Функция op.GetTangent(id) возвращает словарь, содержащий два значения, связанные с 'vl' и 'vr'. Я хочу распаковать его ленивым путем.

vr, vl = op.GetTangent(id).values() 

Могу ли я быть уверен, что vr и vl имеют правильное значение, или же может быть случай, когда они обменивались?

+5

Простой ответ: нет. – jamylak

ответ

6
vr, vl = map(op.GetTangent(id).get, ('vr', 'vl')) 
+0

Это хороший. :) –

+0

Даже лучше, чем у меня! – glglgl

6

Нет, вы никогда не должны зависеть от порядка записей, возвращаемых методом values. У вас есть несколько простых вариантов:

  • вызов sorted на результирующий список (если значения могут быть отсортированы)
  • вызова sorted по пунктам и вытащить значение от
  • Использовать collections.OrderedDict
+1

Учитывая, что он просто тянет значения 'sorted', здесь не поможет. – Duncan

+0

@ Duncan коснуться. –

3

Нет, никогда.

Вместо делать

getbyname = lambda d, *kk: [d[k] for k in kk] 

и использовать его в качестве

vr, vl = getbyname(op.GetTangent(id), 'vr', 'vl') 

или просто сделать

d = op.GetTangent(id) 
vr, vl = [d[i] for i in ('vr', 'vl')] 

, если вам это нужно только один раз.

1

Только для полного избежания всякого сомнения, фактического выхода на моей системе:

C:\Python32>python -c "print({'vr':1, 'vl':2})" 
{'vr': 1, 'vl': 2} 

C:\Python32>python -c "print({'vr':1, 'vl':2})" 
{'vl': 2, 'vr': 1} 

Это работает Python 3.2.3 с PYTHONHASHSEED установлен в «случайные» и различные пробеги идентичного кода имеют разные порядки элементов в словаре.

 Смежные вопросы

  • Нет связанных вопросов^_^