Как сохранить порядок параметров словаря в Python? - PullRequest
1 голос
/ 20 февраля 2010

def createNode(doc_, **param_):
    cache = {'p':'property','l':'label','td':'totalDelay','rd':'routeDelay','ld':'logicDelay'}
    for index in param_:
        newIndex = cache[index]
        value = param_[index]
        print newIndex, '=', value

doc = 10 
createNode(doc, p='path', l='ifft4k_radix4_noUnolling_core.vi', td='3.0', ld='1.0', rd='2.0')

Выполнение этого кода на Python 2.6 дает мне следующий результат.

routeDelay = 2.0
property = path
totalDelay = 3.0
logicDelay = 1.0
label = ifft4k_radix4_noUnolling_core.vi

Мне нужно сохранить порядок параметров, я имею в виду, сначала идет property, затем label, пока я не получу routeDelay в конце.

В: Как сохранить порядок параметров словаря в Python?

Ответы [ 3 ]

7 голосов
/ 20 февраля 2010

Мне нужно сохранить порядок параметр, я имею в виду, свойство приходит сначала, потом маркируйте, пока я не получу reouteDelay last.

Тогда вы просто делаете вещи в неправильном порядке - не нужно заказывать словари! Вместо этого попробуйте кортеж пар для кеша следующим образом:

def createNode(doc_, **param_):
    cache = ( ('p', 'property'), , ('l', 'label'), ('td', 'totalDelay'),
              ('rd', 'routeDelay'), ('ld', 'logicDelay') )
    for index, newIndex in cache:
        if index not in param_:
            continue
        value = param_[index]
        print newIndex, '=', value

Это имеет ту же семантику, что и ваша версия createNode, плюс желаемое свойство поддержания желаемого вами порядка, и производительность по крайней мере так же хороша. Сосредоточившись на «поддержании порядка в словаре», вы сосредотачиваетесь на неправильной проблеме (как, увы, в большинстве случаев, когда люди обращаются к «упорядоченным словарям»! -).

6 голосов
/ 20 февраля 2010

Обычный словарь не подойдет, вместо этого вам придется использовать упорядоченный словарь.Проверьте эти ссылки:

  1. PEP 372: Добавление упорядоченного словаря в коллекции
  2. Использование упорядоченного словаря в качестве объектного словаря в python - ТАК вопрос, чтобы доказать, что люди используют одикт PEP 372: -)
  3. Модуль одиктов Никола Лароса и Майкла Фоорда

Попробуйте термин поиска "Питон заказал словарь ", если вы хотите, чтобы Google вокруг больше.Я помню, как видел несколько вопросов, связанных с заказным диктатом, здесь, в SO, поэтому, если вышеуказанные ссылки по какой-то причине неадекватны, возможно, вы можете найти что-то лучшее в другом вопросе.

Обновление: предложение Марка использоватьсписок кортежей может быть действительно хорошим, но именованные кортежи могут быть более удобными: соответствующий фрагмент в документах .Кроме того, если вы планируете выполнить сериализацию / десериализацию своих данных и хотели бы сделать это очень быстро , проверьте буфера протокола Google (доступны инструменты Python).

3 голосов
/ 20 февраля 2010

Словари не сохраняют порядок ключей. Вы можете использовать список кортежей вместо словаря.

...