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

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

Ответ 1

Я установил orderdict на python 2.6 с помощью pip

pip install ordereddict

Ответ 2

Согласно документации, для Python версии 2.4 или более поздней этот код. Существует также код от Raymond Hettinger, один из участников PEP. Код, как утверждается, работает под 2.6 и 3.0 и был сделан для этого предложения.

Ответ 3

Чтобы импортировать класс 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 (используя пипс или другие методы), но новые версии будут импортированы из встроенного модуля коллекции.

Ответ 4

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

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]

second: [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'] = orderedKeys

Ответ 5

в 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

сделал.

Ответ 6

Для тех, кто по какой-то причине не может зависеть от пользователя, имеющего пипс, вот пример реализации действительно ужасного 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)

Ответ 7

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

  • установить future через pip:

pip install future

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

from future.moves.collections import OrderedDict

источник