Python updates für einige Methoden
Frage
Gibt es eine Rückportierung für die folgenden Methoden zur Arbeit mit Python 2.4:
any, all, collections.defaultdict, collections.deque
Lösung
Nun, zumindest für any
und all
ist es einfach:
def any(iterable):
for element in iterable:
if element:
return True
return False
def all(iterable):
for element in iterable:
if not element:
return False
return True
deque
ist bereits in 2.4.
Wie für defaultdict
, denke ich, dass leicht mit setdefault()
emulieren kann.
Zitiert von Alex Martelli`s (und anderen) sehr zu empfehlen Python-Kochbuch :
Dies ist, was die setdefault Methode Wörterbücher für. Sagen, wir sind Aufbau ein Wort-to-page-Zahlen Index, ein Wörterbuch, das jedes Wort abbildet in der Liste der Seitenzahlen, wo es erscheint. Ein wesentlicher Teil des Codes, dass Anwendung könnte sein:
def addword(theIndex, word, pagenumber):
theIndex.setdefault(word, [ ]).append(pagenumber)
Dieser Code entspricht mehr ausführliche Ansätze wie:
def addword(theIndex, word, pagenumber):
if word in theIndex:
theIndex[word].append(pagenumber)
else:
theIndex[word] = [pagenumber]
und
def addword(theIndex, word, pagenumber):
try:
theIndex[word].append(pagenumber)
except KeyError:
theIndex[word] = [pagenumber]
Andere Tipps
Wie Tim weist darauf hin, all
und any
sind trivial. defaultdict
ist nicht viel schwieriger. Hier ist eine passable Umsetzung glaube ich. Es ist im Wesentlichen eine Übersetzung der Dokumente in dem Code.
Update: ternären Ausdruck entfernt, weil ich daran erinnert, dass das nicht in 2.4
class defaultdict(dict):
def __init__(self, default_factory, *args, **kwargs):
super(defaultdict, self).__init__(*args, **kwargs)
self.default_factory = default_factory
def __missing__(self, key):
try:
self[key] = self.default_factory()
except TypeError:
raise KeyError("Missing key %s" % (key, ))
else:
return self[key]
def __getitem__(self, key):
try:
return super(defaultdict, self).__getitem__(key)
except KeyError:
return self.__missing__(key)
Wenn Sie verwenden es nur ein dict zu bauen, dann sollten Sie die EAFP zu LBYL für __getitem__
zu ändern. Im Moment ist es optimiert die dict zu bauen und sie dann mit einer Menge von nicht-miss-Lookups für eine Weile verwendet werden.
nie Geist. Lesen Sie einfach Tims den ganzen Weg durch Post. Du hast deinen Wunsch. deque
wird härter sein. Ich wünschte, ich hatte die Zeit, das zu tun, nur weil es wahrscheinlich mein Favoriten aus Sammlungen, aber es ist nicht trivial.