Estirar columnas para emparejar celdas coincidentes en filas
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.
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