Pregunta

¿Hay alguna backport de los siguientes métodos para trabajar con Python 2.4:

any, all, collections.defaultdict, collections.deque
¿Fue útil?

Solución

Bueno, al menos para any y all es fácil:

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 ya está en 2,4.

En cuanto a defaultdict, supongo que puede emular fácilmente con setdefault().

Citando de Alex Martelli`s (y de otros) muy recomendable Python Cookbook :

Esto es lo que el método de setdefault diccionarios es para. Decimos que estamos la construcción de una palabra-a-page-números índice, un diccionario que mapea cada palabra a la lista de los números de página donde se aparece. Una pieza clave de código en ese aplicación podría ser:

def addword(theIndex, word, pagenumber):
    theIndex.setdefault(word, [ ]).append(pagenumber)

Este código es equivalente a más verbosa enfoques tales como:

def addword(theIndex, word, pagenumber):
    if word in theIndex:
        theIndex[word].append(pagenumber)
    else:
        theIndex[word] = [pagenumber]

y

def addword(theIndex, word, pagenumber):
    try:
        theIndex[word].append(pagenumber)
    except KeyError:
        theIndex[word] = [pagenumber]

Otros consejos

Como Tim señala, all y any son triviales. defaultdict no es mucho más difícil. He aquí una aplicación aceptable creo. Básicamente se trata de una traducción de los documentos en código.

Actualización: Se ha eliminado la expresión ternaria porque recordé que eso no está en 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)

Si usted está usando para construir un diccionario, entonces es posible que desee cambiar el EAFP a LBYL para __getitem__. en este momento está optimizada para construir el dict y luego usarlo durante un tiempo con una gran cantidad de operaciones de búsqueda no se pierda.

deque va a ser más difícil. Me gustaría tener el tiempo para hacer eso sólo porque es probablemente mi favorita fuera de las colecciones pero es no trivial. Nunca mente. Basta con leer Tims publicar todo el camino a través. Usted consiguió su deseo.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top