¿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.
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:
Salida:
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()
.