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.

War es hilfreich?

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top