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 ordereddict
installeren (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:
- installeer
future
via pip:
pip install future
- importeren en gebruiken OrderedDict:
from future.moves.collections import OrderedDict
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)