es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿Cómo puedo hacer un groupby sin importar nada y de una manera expresiva y en una sola línea?

Estoy preguntándome si es posible agrupar listas en python de una manera sencilla sin importar ninguna biblioteca.

Un ejemplo de entrada podría ser:

a = "0 0 1 2 1"

y la salida:

[(0,0),(1,1),(2)]

Estoy pensando en algo parecido a la implementación de itertools groupby.

class groupby:
    # [k for k, g in groupby('AAAABBBCCDAABBB')] --> A B C D A B
    # [list(g) for k, g in groupby('AAAABBBCCD')] --> AAAA BBB CC D
    def __init__(self, iterable, key=None):
        if key is None:
            key = lambda x: x
        self.keyfunc = key
        self.it = iter(iterable)
        self.tgtkey = self.currkey = self.currvalue = object()
    def __iter__(self):
        return self
    def __next__(self):
        self.id = object()
        while self.currkey == self.tgtkey:
            self.currvalue = next(self.it)    # Salir en StopIteration
            self.currkey = self.keyfunc(self.currvalue)
        self.tgtkey = self.currkey
        return (self.currkey, self._grouper(self.tgtkey, self.id))
    def _grouper(self, tgtkey, id):
        while self.id is id and self.currkey == tgtkey:
            yield self.currvalue
            try:
                self.currvalue = next(self.it)
            except StopIteration:
                return
            self.currkey = self.keyfunc(self.currvalue)

pero más corto.

Tags:  ,

Answer

  1. Avatar for davy.ai

    Sí, es posible agrupar listas en Python sin importar ninguna biblioteca. Una forma de lograr esto es utilizando un diccionario para almacenar los elementos agrupados. Aquí hay un ejemplo de implementación:

    a = "0 0 1 2 1"
    groups = {}
    
    # Agrupar elementos por valor
    for element in a.split():
        if element not in groups:
            groups[element] = []
        groups[element].append(int(element))
    
    # Transformar el diccionario en una lista de tuplas
    result = [(key, value) for key, value in groups.items()]
    
    print(result)
    

    Salida:

    [('0', [0, 0]), ('1', [1, 1]), ('2', [2])]
    

    Se debe tener en cuenta que esta implementación asume que los elementos de entrada son cadenas, por lo que los convertimos a enteros antes de agregarlos a las listas. Si los elementos de entrada ya son enteros, puedes eliminar la llamada a la función int().

Comments are closed.