OrderedDict voor oudere versies van python

Geordende woordenboeken zijn buitengewoon nuttige structuren, maar helaas zijn deze vrij recent en werken ze alleen in versies van 3.1en 2.7. Hoe kan ik een geordend woordenboek gebruiken in oudere versies?


Antwoord 1, autoriteit 100%

Ik heb bestelddict geïnstalleerd op python 2.6 met pip

pip install ordereddict

Antwoord 2, autoriteit 37%

Volgens de documentatie, voor Python-versies 2.4 of hoger deze codemoet worden gebruikt. Er is ook wat code van Raymond Hettinger, een van de bijdragers aan de PEP. Er wordt beweerd dat de code hier werkt onder 2.6 en 3.0 en is gemaakt voor het voorstel.


Antwoord 3, autoriteit 20%

Om een ​​OrderedDict-klasse voor verschillende versies van Python te importeren, overweeg dan dit fragment:

try:
    from collections import OrderedDict
except ImportError:
    from ordereddict import OrderedDict
# Now use it from any version of Python
mydict = OrderedDict()

Versies ouder dan Python 2.6 moeten ordereddictinstalleren (met pip of andere methoden), maar nieuwere versies worden geïmporteerd vanuit de ingebouwde verzamelingsmodule.


Antwoord 4, autoriteit 2%

U kunt er ook gewoon omheen programmeren als uw situatie dit toelaat:

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]

tweede: [115, 101, 99, 111, 110, 100]
vierde: [102, 111, 117, 114, 116, 104]
derde: [116, 104, 105, 114, 100]
eerst: [102, 105, 114, 115, 116]

eerste: [102, 105, 114, 115, 116]
tweede: [115, 101, 99, 111, 110, 100]
derde: [116, 104, 105, 114, 100]
vierde: [102, 111, 117, 114, 116, 104]

Je zou de geordende sleutels ook in je woordenboek kunnen insluiten, neem ik aan, als oDict[‘keyList’] = besteldKeys


Antwoord 5, autoriteit 2%

Je kunt ook future, py2-3 compatibele codebase proberen:

  1. installeer futurevia pip:

pip install future

  1. importeren en gebruiken OrderedDict:

from future.moves.collections import OrderedDict

bron


Antwoord 6

in python2.6 gaf me:

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

maar

$ 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

deed.


Antwoord 7

Voor degenen die er om de een of andere reden niet op kunnen vertrouwen dat de gebruiker pip heeft, is hier een echt verschrikkelijkeimplementatie van OrderedDict (het is onveranderlijk, heeft de meeste functies, maar geen van de prestatieverbeteringen ).

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)

Other episodes