Frage

Gibt es eine Rückportierung für die folgenden Methoden zur Arbeit mit Python 2.4:

any, all, collections.defaultdict, collections.deque
War es hilfreich?

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.

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. nie Geist. Lesen Sie einfach Tims den ganzen Weg durch Post. Du hast deinen Wunsch.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top