Pregunta

Tabla de ejemplo:

  A  |  B  |  C  | ...
-----+-----+-----+----
  3  |  2  |  2  |    
  5  |  3  |  4  |    
  7  |  4  |  6  |    
  9  |  5  |  8  |    

Me gustaría moderarlo de alguna manera con Gnumeric y producir celdas coincidentes en las columnas:

  A  |  B  |  C  | ...
-----+-----+-----+----
  -  |  2  |  2  |    
  3  |  3  |  -  |    
  -  |  4  |  4  |    
  5  |  5  |  -  |    
  -  |  -  |  6  |    
  7  |  -  |  -  |    
  -  |  -  |  8  |    
  9  |  -  |  -  |    

Ejemplo real si con valores de cadena en lugar de números, pero creo que es más fácil de explicar con números

Si esto no es trivial y alguien tiene idea de cómo se puede hacer con listas de Python en lugar de columnas de tabla en Gnumeric, publique una solución de Python.

¿Fue útil?

Solución

Es bastante fácil de hacer en Python:

a = [3, 5, 7, 9]
b = [2, 3, 4, 5]
c = [2, 4, 6, 8]

a_ex, b_ex, c_ex = zip(*(
                        [elem if elem in col else None
                            for col in a, b, c] 
                                for elem in set(a).union(b, c)
                      ))

Parece el más directo si no le preocupa la velocidad.

También acabo de notar mi respuesta a Unir varios iteratorars por una clave se aplica de alguna manera:

def paditers(*args):
    iters = [iter(x) for x in args]

    this = [next(i) for i in iters]

    while True:
        try:
            key = min(i for i in this if i != None)
        except ValueError:
            break
        for i, val in enumerate(this):
            if val == key:
                yield val
                this[i] = next(iters[i], None)
            else:
                yield None

padded = list(paditers(a, b, c))
next_item = iter(padded).next
print zip(*((next_item(), next_item(), next_item()) 
         for _ in range(len(padded) // 3)))

Puede adaptar eso si necesita que el rendimiento se escale linealmente.

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