Strecken Sie die Spalten, um übereinstimmende Zellen in Zeilen zu koppeln
Frage
Beispieltabelle:
A | B | C | ...
-----+-----+-----+----
3 | 2 | 2 |
5 | 3 | 4 |
7 | 4 | 6 |
9 | 5 | 8 |
Ich möchte es irgendwie mit Gnumeric temperieren und passende Zellen über Spalten hinweg erzeugen:
A | B | C | ...
-----+-----+-----+----
- | 2 | 2 |
3 | 3 | - |
- | 4 | 4 |
5 | 5 | - |
- | - | 6 |
7 | - | - |
- | - | 8 |
9 | - | - |
Echtes Beispiel, wenn mit Zeichenfolgenwerten statt Zahlen, aber es ist einfacher, mit Zahlen zu erklären, denke ich
Wenn dies nicht trivial ist und jemand eine Idee hat, wie dies mit Python-Listen anstelle von Tabellenspalten in Gnumeric gemacht werden kann, veröffentlichen Sie bitte eine Python-Lösung.
Lösung
In Python ist das ganz einfach:
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)
))
Scheint am direktesten, wenn Sie sich keine Sorgen um die Geschwindigkeit machen.
Ich habe auch gerade meine Antwort auf Zusammenfügen mehrerer Iteratorare über einen Schlüssel bemerkt Art gilt:
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)))
Sie können dies anpassen, wenn Sie eine lineare Skalierung der Leistung benötigen.