Растянуть столбцы, чтобы связать совпадающие ячейки в строках - PullRequest
0 голосов
/ 20 октября 2011

Пример таблицы:

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

Я бы хотел как-то умерить его с помощью Gnumeric и произвести сопоставление ячеек по столбцам:

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

Реальный пример, если со строковыми значениями вместо чисел, но этоЯ думаю, что это проще объяснить цифрами

Если это не тривиально и кто-то имеет представление о том, как это можно сделать с помощью списков Python вместо столбцов таблицы в Gnumeric, пожалуйста, опубликуйте решение Python.

1 Ответ

1 голос
/ 20 октября 2011

Это довольно легко сделать в 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)
                      ))

Кажется самым прямым, если вы не беспокоитесь о скорости.

Я также только что заметил мой ответ на Соединение нескольких итераторов с помощью ключа применяется:

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)))

Вы можете адаптировать его, если вам нужна производительность для линейного масштабирования.

...