OrderedDict для старых версий python

Упорядоченные словари являются чрезвычайно полезными структурами, но, к сожалению, они сравнительно недавно работают только в версиях с 3.1 и 2.7. Как я могу использовать упорядоченный словарь в старых версиях?

7 ответов

Решение

Я установил заказчик на Python 2.6 с pip

pip install ordereddict

Согласно документации, для Python версий 2.4 или выше этот код должен использоваться. Есть также некоторый код от Рэймонда Хеттингера, одного из участников PEP. Код здесь, как утверждают, работает под 2.6 и 3.0 и был сделан для предложения.

Чтобы импортировать класс OrderedDict для разных версий Python, рассмотрите этот фрагмент:

try:
    from collections import OrderedDict
except ImportError:
    from ordereddict import OrderedDict

# Now use it from any version of Python
mydict = OrderedDict()

Версии старше Python 2.6 нужно будет установить ordereddict (используя pip или другие методы), но более новые версии будут импортированы из встроенного модуля коллекций.

Кроме того, вы можете просто запрограммировать свой обходной путь, если ваша ситуация позволяет:

def doSomething(strInput): return [ord(x) for x in strInput]

things = ['first', 'second', 'third', 'fourth']

oDict = {}
orderedKeys = []
for thing in things:
    oDict[thing] = doSomething(thing)
    orderedKeys.append(thing)

for key in oDict.keys():
    print key, ": ", oDict[key]

print

for key in orderedKeys:
    print key, ": ", oDict[key]

второй: [115, 101, 99, 111, 110, 100]
четвертый: [102, 111, 117, 114, 116, 104]
третий: [116, 104, 105, 114, 100]
сначала: [102, 105, 114, 115, 116]

сначала: [102, 105, 114, 115, 116]
второй: [115, 101, 99, 111, 110, 100]
третий: [116, 104, 105, 114, 100]
четвертый: [102, 111, 117, 114, 116, 104]

Вы также можете встраивать упорядоченные ключи в свой словарь, так как oDict['keyList'] = orderKeys

Также вы можете попробовать future, py2-3 совместимая кодовая база:

  1. устанавливать future через пункт:

pip install future

  1. импортировать и использовать OrderedDict:

from future.moves.collections import OrderedDict

источник

В python2.6 дал мне:

$ pip install ordereddict
  Could not find a version that satisfies the requirement from (from versions:)
No matching distribution found for from

но

$ easy_install ordereddict
install_dir /usr/local/lib/python2.6/dist-packages/
Searching for ordereddict
Reading http://pypi.python.org/simple/ordereddict/
Best match: ordereddict 1.1
Downloading https://pypi.python.org/packages/source/o/ordereddict/ordereddict-1.1.tar.gz#md5=a0ed854ee442051b249bfad0f638bbec
Processing ordereddict-1.1.tar.gz
Running ordereddict-1.1/setup.py -q bdist_egg --dist-dir /tmp/easy_install-lYgPE3/ordereddict-1.1/egg-dist-tmp-GF2v6g
zip_safe flag not set; analyzing archive contents...
Adding ordereddict 1.1 to easy-install.pth file

Installed /usr/local/lib/python2.6/dist-packages/ordereddict-1.1-py2.6.egg
Processing dependencies for ordereddict
Finished processing dependencies for ordereddict

сделал.

Для тех, кто по какой-то причине не может рассчитывать на то, что у пользователя есть pip, вот действительно ужасная реализация OrderedDict (она неизменна, имеет большинство функций, но не повышает производительность).

class OrderedDict(tuple):
    '''A really terrible implementation of OrderedDict (for python < 2.7)'''
    def __new__(cls, constructor, *args):
        items = tuple(constructor)
        values = tuple(n[1] for n in items)
        out = tuple.__new__(cls, (n[0] for n in items))
        out.keys = lambda: out
        out.items = lambda: items
        out.values = lambda: values
        return out

    def __getitem__(self, key):
        try:
            return next(v for (k, v) in self.items() if k == key)
        except:
            raise KeyError(key)
Другие вопросы по тегам